LogStashLogger는 Ruby의 Logger
클래스를 확장하여 Logstash에 직접 기록합니다. Logstash JSON 형식의 다양한 출력에 대한 쓰기를 지원합니다. Logstash는 구조화된 데이터를 직접 수신할 수 있으므로 파일이나 syslog에 쓰는 것보다 개선되었습니다.
UDP 또는 TCP/SSL 연결을 통해 logstash 리스너에 직접 쓸 수 있습니다.
Redis, Kafka, Kinesis, Firehose, Unix 소켓, syslog, stdout 또는 stderr 파일에 쓸 수 있습니다.
Logger는 문자열 메시지, 해시, LogStash::Event
, 객체 또는 JSON 문자열을 입력으로 사용할 수 있습니다.
이벤트는 메시지, 타임스탬프, 호스트 및 심각도로 자동으로 채워집니다.
Logstash JSON 형식으로 작성하지만 다른 형식도 지원합니다.
여러 출력에 쓸 수 있습니다.
로그 메시지는 버퍼링되어 연결 문제가 있는 경우 자동으로 다시 전송됩니다.
구성을 통해 Rails와 쉽게 통합됩니다.
애플리케이션의 Gemfile에 다음 줄을 추가하세요.
gem 'logstash-logger'
그런 다음 다음을 실행합니다.
$ bundle
또는 다음과 같이 직접 설치하십시오.
$ gem install logstash-logger
require 'logstash-logger'# 기본값은 UDP on 0.0.0.0logger = LogStashLogger.new(port: 5228)# 호스트 및 유형(UDP 또는 TCP)을 명시적으로 지정udp_logger = LogStashLogger.new(type: :udp, 호스트: 'localhost' , 포트: 5228)tcp_logger = LogStashLogger.new(유형: :tcp, 호스트: 'localhost', 포트: 5229)# 다른 유형의 로거file_logger = LogStashLogger.new(type: :file, path: 'log/development.log', sync: true)unix_logger = LogStashLogger.new(type: :unix, path: '/tmp/sock' )syslog_logger = LogStashLogger.new(유형: :syslog)redis_logger = LogStashLogger.new(유형: :redis)kafka_logger = LogStashLogger.new(유형: :kafka)stdout_logger = LogStashLogger.new(유형: :stdout)stderr_logger = LogStashLogger.new(유형: :stderr)io_logger = LogStashLogger.new(유형: :io, io: io )# 다른 형식을 사용하십시오tercee_logger = LogStashLogger.new( 유형: :tcp, 호스트: 'logsene-receiver-syslog.sematext.com', 포트: 514, 포맷터: :cee_syslog)custom_formatted_logger = LogStashLogger.new( 유형: :redis, 포맷터: MyCustomFormatter)lambda_formatted_logger = LogStashLogger.new( 유형: :stdout, 포맷터: ->(심각도, 시간, 프로그램 이름, msg) { "[#{progname}] #{msg}" })ruby_default_formatter_logger = LogStashLogger.new( 유형: :파일, 경로: 'log/development.log', formatter: ::Logger::Formatter)# 메시지를 여러 출력으로 보냅니다. 각 출력은 동일한 형식을 갖습니다.# Syslog는 별도의 로거가 필요하므로 출력이 될 수 없습니다.multi_delegating_logger = LogStashLogger.new( 유형: :multi_delegator, 출력: [{ 유형: :file, 경로: 'log/development.log' },{ 유형: :udp, 호스트: 'localhost', 포트: 5228 } ])# 여러 출력 간의 메시지 균형을 유지합니다.# 다중 위임자와 동일하게 작동하지만 각 메시지를 보낼 출력을 무작위로 선택합니다.balancer_logger = LogStashLogger.new( 유형: :밸런서, 출력: [{ 유형: :udp, 호스트: 'host1', 포트: 5228 },{ 유형: :udp, 호스트: 'host2', 포트: 5228 } ])# 여러 로거에 메시지를 보냅니다.# 서로 다른 형식을 서로 다른 출력으로 보내야 하는 경우 이것을 사용합니다.# syslog에 기록해야 하는 경우 this.multi_logger = LogStashLogger.new( 유형: :multi_logger, 출력: [{ 유형: :file, 경로: 'log/development.log', 포맷터: ::Logger::Formatter },{ 유형: :tcp, 호스트: 'localhost', 포트: 5228, 포맷터: :json } ])# UDP 포트 5228에 다음 메시지가 기록됩니다:logger.info 'test'# {"message":"test","@timestamp":"2014-05-22T09:37:19.204-07:00", "@version":"1","심각도":"INFO","host":"[호스트 이름]"}logger.error '{"message": "error"}'# {"message":"error","@timestamp":"2014-05-22T10:10:55.877-07:00","@version":"1","심각도":" ERROR","host":"[hostname]"}logger.debug 메시지: 'test', foo: 'bar'# {"message":"test","foo":"bar","@timestamp":"2014-05-22T09:43:24.004-07:00","@version":"1","심각도" :"DEBUG","host":"[hostname]"}logger.warn LogStash::Event.new(message: 'test', foo: 'bar')# {"message":"test","foo":"bar","@timestamp":"2014-05-22T16:44:37.364Z","@version":"1"," 심각도":"경고","호스트":"[호스트 이름]"}# 태그됨logginglogger.tagged('foo') { logger.fatal('bar') }# {"message":"bar","@timestamp":"2014-05-26T20:35:14.685-07:00","@version":"1","심각도":"치명적","호스트" :"[호스트 이름]","태그":["foo"]}
해시 대신 URI를 사용하여 Logstash 로거를 구성할 수 있습니다. 이는 환경에서 구성 값을 읽으려는 Heroku와 같은 환경에서 유용합니다. URI 체계는 type://host:port/path?key=value
. 일부 샘플 URI 구성이 아래에 나와 있습니다.
udp://localhost:5228 tcp://localhost:5229 unix:///tmp/socket file:///path/to/file redis://localhost:6379 kafka://localhost:9092 stdout:/ stderr:/
다음과 같이 URI를 Logstash 로거에 전달합니다.
# 환경 변수 로거에서 URI를 읽습니다 = LogStashLogger.new(uri: ENV['LOGSTASH_URI'])
Logstash가 이벤트를 올바르게 수신하고 구문 분석하려면 json_lines
코덱을 사용하는 리스너를 구성하고 실행해야 합니다. 예를 들어 포트 5228에서 UDP를 통해 이벤트를 수신하려면 다음을 수행하세요.
입력 { udp {호스트 => "0.0.0.0"포트 => 5228codec => json_lines }}
파일 및 Redis 입력은 대신 json
코덱을 사용해야 합니다. 자세한 내용은 Logstash 문서를 읽어보세요.
더 많은 구성 샘플을 보려면 샘플 디렉터리를 참조하세요.
TCP를 사용하는 경우 초기화 시 옵션 해시에 SSL 인증서를 추가하는 옵션이 있습니다.
LogStashLogger.new(유형: :tcp, 포트: 5228, ssl_certificate: "/path/to/certificate.crt")
SSL 인증서와 키는 다음을 사용하여 생성할 수 있습니다.
openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout logstash.key -out logstash.crt
인증서 없이 SSL을 활성화할 수도 있습니다.
LogStashLogger.new(유형: :tcp, 포트: 5228, ssl_enable: true)
동작을 더 효과적으로 제어하려면 SSL 컨텍스트를 지정하세요. 예를 들어 확인 모드를 설정합니다.
ctx = OpenSSL::SSL::SSLContext.newctx.set_params(verify_mode: OpenSSL::SSL::VERIFY_NONE)LogStashLogger.new(유형: :tcp, 포트: 5228, ssl_context: ctx)
SSL에는 다음 Logstash 구성이 필요합니다.
입력 { tcp {호스트 => "0.0.0.0"포트 => 5228codec => json_inesssl_enable => truessl_cert => "/path/to/certificate.crt"ssl_key => "/path/to/key.key" }}
호스트 이름 확인은 기본적으로 활성화되어 있습니다. 추가 구성 없이 :host
에 제공된 호스트 이름은 서버의 인증서 ID를 확인하는 데 사용됩니다.
:ssl_context
를 전달하지 않거나 :verify_hostname
옵션에 잘못된 값을 전달하면 호스트 이름 확인이 발생하지 않습니다.
:host
옵션에서 호스트 이름을 확인하세요.
ctx = OpenSSL::SSL::SSLContext.newctx.cert = '/path/to/cert.pem'ctx.verify_mode = OpenSSL::SSL::VERIFY_PEERLogStashLogger.new 유형: :tcp, 호스트: 'logstash.example.com' 포트: 5228, ssl_context: ctx
:host
옵션과 다른 호스트 이름을 확인하세요.
LogStashLogger.new 유형: :tcp, 호스트: '1.2.3.4' 포트: 5228, ssl_context: ctx, verify_hostname: 'server.example.com'
호스트 이름 확인을 명시적으로 비활성화합니다.
LogStashLogger.new 유형: :tcp, 호스트: '1.2.3.4' 포트: 5228, ssl_context: ctx, verify_hostname: 거짓
LogStashLogger
기본적으로 아래 형식으로 JSON 개체를 기록합니다.
{ "message":"어떤 메시지", "@timestamp":"2015-01-29T10:43:32.196-05:00", "@version":"1", "severity":"INFO", "host ":"호스트 이름"}
일부 애플리케이션은 각 메시지에 추가 메타데이터를 첨부해야 할 수도 있습니다. LogStash::Event
LogStashLogger
구성에서 customize_event
블록을 지정하여 직접 조작할 수 있습니다.
config = LogStashLogger.configure do |config| config.customize_event do |event|event["other_field"] = "some_other_value" 끝
이 구성을 사용하면 다음과 같은 결과가 출력됩니다.
{"message": "일부 메시지","@timestamp": "2015-01-29T10:43:32.196-05:00","@version": "1","severity": "INFO","host ": "호스트 이름","other_field": "some_other_value"}
이 블록은 이벤트에 대한 전체 액세스 권한을 가지므로 필드를 제거하고 기존 필드를 수정하는 등의 작업을 할 수 있습니다. 예를 들어 기본 타임스탬프를 제거하려면 다음을 수행하세요.
config = LogStashLogger.configure do |config| config.customize_event do |event|event.remove('@timestamp') 끝
로거를 생성할 때 호출 가능한 객체(lambda 또는 proc)를 customize_event
옵션에 전달하여 로거별로 이벤트를 사용자 정의할 수도 있습니다.
LogStashLogger.new(customize_event: ->(event){ event['other_field'] = 'other_field' })
원격 서비스에 대한 연결을 설정하는 장치의 경우 로그 메시지는 내부적으로 버퍼링되고 백그라운드 스레드에서 플러시됩니다. 연결 문제가 있는 경우 메시지는 버퍼에 보관되었다가 성공할 때까지 자동으로 재전송됩니다. 일괄 쓰기를 지원하는 출력(Redis 및 Kafka)은 버퍼에서 대량으로 로그 메시지를 작성합니다. 이 기능은 Stud::Buffer 포크를 사용하여 구현됩니다. LogStashLogger에 다음 옵션을 전달하여 동작을 구성할 수 있습니다.
:buffer_max_items - 플러시하기 전에 버퍼링할 최대 항목 수입니다. 기본값은 50입니다.
:buffer_max_interval - 플러시 사이에 대기하는 최대 시간(초)입니다. 기본값은 5입니다.
:drop_messages_on_flush_error - 플러시 오류가 발생하면 메시지를 삭제합니다. 기본값은 거짓입니다.
:drop_messages_on_full_buffer - 버퍼가 가득 차면 메시지를 삭제합니다. 기본값은 true입니다.
:sync - 메시지가 수신될 때마다 버퍼를 플러시합니다(차단). 기본값은 거짓입니다.
:buffer_flush_at_exit - 프로그램을 종료할 때 메시지를 플러시합니다. 기본값은 true입니다.
:buffer_logger - 버퍼 디버그/오류 메시지를 기록하는 로거입니다. 기본값은 없음입니다.
sync = true
설정하여 버퍼링을 끌 수 있습니다.
이 동작에 대해 다음 사항에 주의하세요.
재시도 시 중복된 로그 메시지가 전송될 수 있습니다. 배치로 작성하는 Redis 및 Kafka와 같은 출력의 경우 전체 배치가 다시 전송될 수 있습니다. 이것이 문제가 되는 경우 각 이벤트에 UUID 필드를 추가하여 고유하게 식별할 수 있습니다. 이 작업은 customize_event
블록에서 수행하거나 logstash의 UUID 필터를 사용하여 수행할 수 있습니다.
여전히 로그 메시지가 손실될 수 있습니다. Ruby는 TCP/UDP 연결 문제를 즉시 감지하지 않습니다. 내 테스트에서는 Ruby가 수신 측의 작동이 중단되었음을 확인하고 예외 발생을 시작하는 데 약 4초가 걸렸습니다. TCP/UDP를 통한 logstash 리스너는 수신된 메시지를 확인하지 않으므로 어떤 로그 메시지를 다시 보낼지 알 수 없습니다.
sync
꺼지면 Ruby는 IO 장치에 쓰기 전에 내부적으로 데이터를 버퍼링할 수 있습니다. 이것이 LogStashLogger의 버퍼가 주기적으로 플러시되더라도 UDP 또는 TCP 소켓에 즉시 기록된 메시지를 볼 수 없는 이유입니다.
기본적으로 버퍼가 가득 차면 메시지가 삭제됩니다. 이는 출력 소스가 너무 오랫동안 다운되었거나 로그 메시지가 너무 빨리 수신되는 경우 발생할 수 있습니다. 애플리케이션이 갑자기 종료되면(예: SIGKILL 또는 정전으로 인해) 전체 버퍼가 손실됩니다.
buffer_max_items
늘리고(버퍼에 더 많은 이벤트를 보관할 수 있도록) buffer_max_interval
줄이면(플러시 간 대기 시간을 단축하여) 메시지 손실 가능성을 줄일 수 있습니다. 이렇게 하면 로그 메시지가 버퍼에 누적되면서 애플리케이션의 메모리 부담이 증가하므로 프로세스에 충분한 메모리를 할당했는지 확인하세요.
버퍼가 가득 차도 메시지를 잃지 않으려면 drop_messages_on_full_buffer = false
로 설정할 수 있습니다. 버퍼가 가득 차면 들어오는 로그 메시지가 모두 차단되므로 바람직하지 않을 수 있습니다.
모든 로거 출력은 sync
설정을 지원합니다. 이는 Ruby IO 개체의 "동기화 모드" 설정과 유사합니다. true
로 설정하면 출력이 즉시 플러시되고 내부적으로 버퍼링되지 않습니다. 일반적으로 원격 서비스에 연결하는 장치의 경우 버퍼링은 성능을 향상시키고 프로그램에 영향을 미치는 오류 가능성을 줄여주기 때문에 좋습니다. 이러한 장치의 경우 sync
기본값은 false
이며 기본값을 그대로 두는 것이 좋습니다. 예를 들어 로그 메시지가 작성된 후 즉시 확인하려는 경우 테스트를 위해 동기화 모드를 설정할 수 있습니다.
파일 및 Unix 소켓 출력에 대해 동기화 모드를 켜는 것이 좋습니다. 이렇게 하면 서로 다른 스레드나 프로세스의 로그 메시지가 별도의 줄에 올바르게 기록됩니다.
자세한 내용은 #44를 참조하세요.
장치에 메시지를 쓰는 동안 예외가 발생하면 내부 로거를 사용하여 예외가 기록됩니다. 기본적으로 이는 $stderr에 기록됩니다. LogStashLogger.configuration.default_error_logger
설정하거나 LogStashLogger를 인스턴스화할 때 :error_logger
구성 키에 자체 로거 객체를 전달하여 오류 로거를 변경할 수 있습니다.
LogStashLogger는 Rails 스타일 로거 침묵을 지원합니다. 구현은 Rails에서 추출되었지만 종속성이 없으므로 Rails 앱 외부에서 사용할 수 있습니다. 인터페이스는 Rails와 동일합니다:
logger.silence(temporary_level) 수행 ...끝
기본적으로 LogStashLogger는 Ruby의 내장 Logger
클래스를 확장하는 로거를 생성합니다. 다른 로거 구현이 필요한 경우 logger_class
옵션을 사용하여 클래스를 전달하여 다른 클래스를 사용할 수 있습니다.
syslog의 경우 Syslog::Logger
클래스가 필요하며 변경할 수 없습니다.
레일스 4.2 및 5.x를 지원합니다.
기본적으로 모든 Rails 로그 메시지는 LogStash::Event
JSON 형식으로 logstash에 기록됩니다.
최소한의 구조화된 Logstash 이벤트를 위해서는 다음 gem 중 하나를 사용해 보세요.
로그리지
야더
현재 이러한 gem은 LogStashLogger가 구문 분석하는 JSON 문자열을 출력합니다. 이러한 gem의 향후 버전은 잠재적으로 LogStashLogger와 더 긴밀하게 통합될 수 있습니다(예: LogStash::Event
개체를 직접 작성하여).
config/environments/production.rb
에 다음을 추가하세요.
# 선택 사항, Rails는 기본값을 :infoconfig.log_level = :debug# 선택 사항, Rails 4의 기본값은 개발에서는 true이고 Productionconfig.autoflush_log = true에서는 false입니다.# 선택 사항, URI를 사용하여 구성합니다. Herokuconfig.logstash.uri에서 유용합니다 = ENV['LOGSTASH_URI']# 선택 사항. 기본값은 :json_lines입니다. 출력이 여러 개인 경우# 모두 동일한 formatter.config.logstash.formatter = :json_lines# 선택 사항, 쓰기 오류를 기록할 로거를 공유합니다. 기본값은 $stderrconfig.logstash.error_logger에 대한 로깅 = Logger.new($stderr)# 선택 사항이며 플러시하기 전에 버퍼링할 최대 항목 수입니다. 기본값은 50config.logstash.buffer_max_items = 50#입니다. 선택 사항이며 플러시 간 최대 대기 시간(초)입니다. 기본값은 5config.logstash.buffer_max_interval = 5#입니다. 선택 사항, 연결 오류가 발생하면 메시지를 삭제합니다. 기본값은 falseconfig.logstash.drop_messages_on_flush_error = false#입니다. 선택 사항으로, 버퍼가 가득 차면 메시지를 삭제합니다. 기본값은 trueconfig.logstash.drop_messages_on_full_buffer = true
# 선택 사항, 기본값은 '0.0.0.0'입니다.config.logstash.host = 'localhost'# 선택 사항, 기본값은 :udp.config.logstash.type = :udp# 필수, 연결할 포트는config.logstash.port = 5228입니다.
# 선택 사항, 기본값은 '0.0.0.0'입니다.config.logstash.host = 'localhost'# 필수, 연결할 포트config.logstash.port = 5228# 필수config.logstash.type = :tcp# 선택 사항, SSLconfig.logstash를 활성화합니다. ssl_enable = 사실
# 필수config.logstash.type = :unix# 필수config.logstash.path = '/tmp/sock'
Ruby 1.9를 사용하는 경우 Syslog::Logger
v2를 Gemfile에 추가하세요.
gem 'SyslogLogger', '2.0'
Ruby 2+를 사용하는 경우 Syslog::Logger
이미 표준 라이브러리에 내장되어 있습니다.
# 필수config.logstash.type = :syslog# 선택사항. 기본값은 'ruby'config.logstash.program_name = 'MyApp'# 선택적인 기본 기능 수준입니다. Ruby 2+config.logstash.facility = Syslog::LOG_LOCAL0에서만 작동합니다.
Gemfile에 redis gem을 추가하세요.
gem 'redis'
# 필수config.logstash.type = :redis# 선택 사항, 기본값은 'logstash'입니다. listconfig.logstash.list = 'logstash'# 다른 모든 옵션은 Redis 클라이언트에 전달됩니다# 지원되는 옵션에는 호스트, 포트, 경로, 비밀번호가 포함됩니다 , url# 예:# 선택 사항, Redis는 기본적으로 localhostconfig.logstash.host = 'localhost'# 선택 사항, Redis는 기본적으로 포트 6379config.logstash.port =를 사용합니다. 6379
Gemfile에 포세이돈 보석을 추가합니다.
gem 'poseidon'
# 필수config.logstash.type = :kafka# 선택 사항, 기본값은 'logstash' 주제입니다.config.logstash.path = 'logstash'# 선택 사항, 기본값은 'logstash-logger' producerconfig.logstash.producer = 'logstash-logger '# 선택 사항, 기본값은 localhost:9092입니다. host/portconfig.logstash.hosts = ['localhost:9092']# 선택 사항, 기본값은 다음과 같습니다. 1초 backoffconfig.logstash.backoff = 1
Gemfile에 aws-sdk gem을 추가합니다.
# aws-sdk >= 3.0 gem 'aws-sdk-kinesis' # aws-sdk < 3.0 gem 'aws-sdk'
# 필수config.logstash.type = :kinesis# 선택 사항, 기본값은 'logstash'입니다. streamconfig.logstash.stream = 'my-stream-name'# 선택 사항, 기본값은 'us-east-1'config.logstash.aws_region입니다. = 'us-west-2'# 선택 사항, 기본값은 AWS_ACCESS_KEY_ID 환경 변수config.logstash.aws_access_key_id = 'ASKASKHLD12341'# 선택 사항, 기본값은 AWS_SECRET_ACCESS_KEY 환경 변수config.logstash.aws_secret_access_key = 'ASKASKHLD1234123412341234'
Gemfile에 aws-sdk gem을 추가합니다.
# aws-sdk >= 3.0 gem 'aws-sdk-firehose' # aws-sdk < 3.0 gem 'aws-sdk'
# 필수config.logstash.type = :firehose# 선택 사항, 기본값은 'logstash' 전달 스트림입니다.config.logstash.stream = 'my-stream-name'# 선택 사항, 기본값은 AWS 기본 지역 구성입니다. chainconfig.logstash.aws_region = ' us-west-2'# 선택 사항, 기본값은 AWS 기본 자격 증명 공급자 chainconfig.logstash.aws_access_key_id = 'ASKASKHLD12341'# 선택 사항, 기본값은 AWS 기본 자격 증명 공급자 chainconfig.logstash.aws_secret_access_key = 'ASKASKHLD1234123412341234'
# 필수config.logstash.type = :file# 선택 사항, 기본값은 Rails 로그 경로입니다config.logstash.path = 'log/production.log'
# 필수config.logstash.type = :io# 필수config.logstash.io = io
# 필수config.logstash.type = :multi_delegator# 필수config.logstash.outputs = [ {유형: :파일, 경로: 'log/production.log' }, {유형: :udp,포트: 5228,호스트: 'localhost' }]
# 필수config.logstash.type = :multi_logger# 필수. 각 로거에는 자체 formatter.config.logstash.outputs = [가 있을 수 있습니다. {유형: :file,경로: 'log/production.log',formatter: ::Logger::Formatter }, {유형: :udp,포트: 5228,호스트: 'localhost' }]
웹 애플리케이션에서는 RequestStore 미들웨어를 사용하여 HTTP 요청(예: 헤더)의 데이터를 기록할 수 있습니다. 다음 예에서는 Rails를 가정합니다.
# Gemfilegem 'request_store'에 있음
# application.rbLogStashLogger.configure에서 |config| config.customize_event do |event|event["session_id"] = RequestStore.store[:load_balancer_session_id] 끝
# app/controllers/application_controller.rbbefore_filter에서 :track_load_balancer_session_iddef track_load_balancer_session_id RequestStore.store[:load_balancer_session_id] = request.headers["X-LOADBALANCER-SESSIONID"]end
많은 웹 서버에서 흔히 발생하는 것처럼 애플리케이션이 분기되는 경우 LogStashLogger 인스턴스에서 리소스 정리를 관리해야 합니다. 이 목적으로 인스턴스 메소드 #reset
사용할 수 있습니다. 다음은 Rails와 함께 사용되는 몇 가지 일반적인 웹 서버에 대한 샘플 구성입니다.
승객:
::PhusionPassenger.on_event(:starting_worker_process) do |forked| Rails.logger.resetend
퓨마:
# config/puma.rbon_worker_boot에서 수행 Rails.logger.resetend
일각수
# config/unicorn.rbafter_fork에서 |server,worker| Rails.logger.resetend
다음과 함께 작동하는 것으로 확인되었습니다.
MRI 루비 2.2 - 2.5
JRuby 9.x
루비니우스
Ruby 버전 < 2.2는 EOL되어 더 이상 지원되지 않습니다.
특정 요구 사항에 따라 다르지만 대부분의 애플리케이션은 기본값(UDP)을 사용해야 합니다. 각 유형의 장점과 단점은 다음과 같습니다.
UDP는 비동기(fire-and-forget) 방식이므로 TCP보다 빠릅니다. 그러나 이는 로그 메시지가 삭제될 수 있음을 의미합니다. 이는 많은 응용 프로그램에 적합합니다.
TCP는 양방향 통신을 통해 모든 메시지가 수신되었는지 확인합니다. 또한 네트워크를 통한 로그 메시지의 안전한 전송을 위해 SSL을 지원합니다. 이로 인해 TCP 수신기의 부하가 심한 경우 앱 속도가 크롤링 속도로 느려질 수 있습니다.
파일은 사용하기 간단하지만 로그 회전 및 디스크 공간 부족을 걱정해야 합니다.
Unix 소켓에 쓰는 것은 TCP 또는 UDP 포트에 쓰는 것보다 빠르지만 로컬에서만 작동합니다.
Redis에 쓰기는 수많은 로그를 생성하는 분산 설정에 적합합니다. 그러나 또 다른 이동 부분이 있으며 Redis의 메모리 부족에 대해 걱정해야 합니다.
stdout에 쓰는 것은 디버깅 목적으로만 권장됩니다.
UDP와 TCP에 대한 더 자세한 설명을 보려면 UDP와 TCP의 기사를 읽어 보시기 바랍니다.
Ruby IO 개체(예: 파일, UDP 소켓 또는 TCP 소켓)가 지원하는 장치를 사용하는 경우 Ruby가 자체 내부 버퍼를 유지한다는 점에 유의하세요. LogStashLogger가 메시지를 버퍼링하고 주기적으로 플러시한다는 사실에도 불구하고 IO 객체에 기록된 데이터는 Ruby에 의해 내부적으로 무기한 버퍼링될 수 있으며 프로그램이 종료될 때까지 기록되지 않을 수도 있습니다. 이것이 귀찮거나 로그 메시지를 즉시 확인해야 하는 경우 유일한 방법은 sync: true
옵션을 설정하는 것입니다.
귀하의 애플리케이션은 아마도 유효한 방식으로 인코딩되지 않은 데이터를 기록하려고 시도하고 있는 것 같습니다. 이런 일이 발생하면 Ruby의 표준 JSON 라이브러리에서 예외가 발생합니다. Oj와 같은 다른 JSON 인코더를 교체하여 이 문제를 극복할 수 있습니다. JSON 생성에 Oj를 사용하려면 oj_mimic_json gem을 사용하세요.
Heroku는 로그가 STDOUT으로 전송되도록 Rails_12factor를 설치할 것을 권장합니다. 안타깝게도 이는 LogStashLogger를 재정의하여 로그가 구성된 대상으로 전송되지 않도록 합니다. 해결책은 Gemfile에서 rails_12factor
제거하는 것입니다.
이는 LogStashLogger의 문제가 아닐 가능성이 높으며 오히려 Rails.logger
의 로그 수준을 변경하는 다른 gem입니다. 이는 특히 Puma와 같은 스레드 서버를 사용하는 경우 발생할 가능성이 높습니다. gem이 스레드로부터 안전하지 않은 방식으로 Rails.logger
의 로그 수준을 변경하는 경우가 많기 때문입니다. 자세한 내용은 #17을 참조하세요.
UDP 출력을 사용하고 로그스태시 리스너에 쓰는 경우, 로그스태시 리스너의 UDP 구현에서 버그가 발생할 가능성이 높습니다. 현재로서는 알려진 수정 사항이 없습니다. 자세한 내용은 #43을 참조하세요.
TCP 또는 UDP 사용의 알려진 단점은 전체 메시지 크기가 65535바이트로 제한된다는 것입니다. 이 문제를 해결하려면 최대 메시지 크기를 설정하여 메시지를 잘라야 합니다.
LogStashLogger.configure do |config| config.max_message_size = 2000end
그러면 LogStash 이벤트의 message
필드만 잘립니다. 따라서 다른 필드를 위한 공간을 확보하려면 최대 메시지 크기를 65535바이트보다 훨씬 작게 설정해야 합니다.
Rails 3.2, MRI Ruby < 2.2 및 JRuby 1.7은 단종되었으므로 더 이상 지원되지 않습니다. 이전 버전의 Ruby를 사용하는 경우 0.24 이하를 사용해야 합니다.
최신 Logstash와 더 잘 일치하도록 source
이벤트 키가 host
로 대체되었습니다.
(host, port, type)
생성자는 옵션 해시 생성자를 위해 더 이상 사용되지 않습니다.
LogStash::Event
버전 1.2 이상부터 v1 형식을 사용합니다. v1을 사용하는 경우 LogStashLogger 버전 0.4+를 설치해야 합니다. 이는 v0 형식을 사용하는 이전 LogStash::Event
v1.1.5와 역호환되지 않습니다.
이 gem의 이전 버전(<= 0.2.1)은 TCP 연결만 구현했습니다. 최신 버전(>= 0.3)도 UDP를 구현하고 이를 새로운 기본값으로 사용합니다. 기본 생성자를 사용 중이고 여전히 TCP가 필요한 경우 추가 인수를 추가해야 합니다.
# 이제 TCPlogger 대신 UDP가 기본값입니다 = LogStashLogger.new('localhost', 5228)# UDPlogger 대신 TCP를 명시적으로 지정합니다 = LogStashLogger.new('localhost', 5228, :tcp)
데이비드 버틀러
pctj101
게리 레니
닉 에티어
아론 마브리
얀 슐테
커트 프레스턴
크리스 블래츨리
펠릭스 벡슈타인
바딤 카자코프
아닐 렘툴라
니키타 보로베이
파이어보이1919
마이크 건더로이
비탈리 고로데츠키
코트랜드 콜드웰
비벡 슈레스타
알렉스 이아누스
크레이그 리드
글라스지그
빈 란
주앙 페르난데스
쿨엘비스
세르게이 피안코프
알렉 호이
알렉세이 크라스노페로프
가브리엘 드 올리베이라
블라디슬라프 샤브루크
Matus Vacula
포크해
기능 브랜치를 생성합니다( git checkout -b my-new-feature
).
변경 사항 커밋( git commit -am 'Add some feature'
)
브랜치로 푸시( git push origin my-new-feature
)
새로운 Pull Request 생성