LogStashLogger memperluas kelas Logger
Ruby untuk login langsung ke Logstash. Ini mendukung penulisan ke berbagai output dalam format logstash JSON. Ini merupakan peningkatan dibandingkan menulis ke file atau syslog karena Logstash dapat menerima data terstruktur secara langsung.
Dapat menulis langsung ke pendengar logstash melalui koneksi UDP atau TCP/SSL.
Dapat menulis ke file, Redis, Kafka, Kinesis, Firehose, soket unix, syslog, stdout, atau stderr.
Logger dapat mengambil pesan string, hash, LogStash::Event
, objek, atau string JSON sebagai input.
Acara secara otomatis diisi dengan pesan, stempel waktu, host, dan tingkat keparahan.
Menulis dalam format logstash JSON, tetapi mendukung format lain juga.
Dapat menulis ke beberapa output.
Pesan log di-buffer dan dikirim ulang secara otomatis jika ada masalah koneksi.
Terintegrasi dengan mudah dengan Rails melalui konfigurasi.
Tambahkan baris ini ke Gemfile aplikasi Anda:
gem 'logstash-logger'
Dan kemudian jalankan:
$ bundle
Atau instal sendiri sebagai:
$ gem install logstash-logger
memerlukan 'logstash-logger'# Defaultnya adalah UDP pada 0.0.0.0logger = LogStashLogger.new(port: 5228)# Tentukan host dan ketik (UDP atau TCP) secara eksplisitudp_logger = LogStashLogger.new(ketik: :udp, host: 'localhost' , port: 5228)tcp_logger = LogStashLogger.baru(ketik: :tcp, host: 'localhost', port: 5229)# Tipe logger lainnyafile_logger = LogStashLogger.new(tipe: :file, jalur: 'log/development.log', sinkronisasi: true)unix_logger = LogStashLogger.new(tipe: :unix, jalur: '/tmp/ kaus kaki')syslog_logger = LogStashLogger.baru(ketik: :syslog)redis_logger = LogStashLogger.baru(ketik: :redis)kafka_logger = LogStashLogger.baru(ketik: :kafka)stdout_logger = LogStashLogger.baru(ketik: :stdout)stderr_logger = LogStashLogger.baru(ketik: :stderr)io_logger = LogStashLogger.baru(ketik: :io, io: io )# Gunakan formattercee_logger yang berbeda = LogStashLogger.new( ketik: :tcp, tuan rumah: 'logsene-receiver-syslog.sematext.com', pelabuhan: 514, pemformat: :cee_syslog)custom_formatted_logger = LogStashLogger.new( ketik: :redis, pemformat: MyCustomFormatter)lambda_formatted_logger = LogStashLogger.new( ketik: :stdout, formatter: ->(tingkat keparahan, waktu, nama program, pesan) { "[#{progname}] #{msg}" })ruby_default_formatter_logger = LogStashLogger.new( ketik: :berkas, jalur: 'log/development.log', formatter: ::Logger::Formatter)# Kirim pesan ke beberapa output. Setiap keluaran akan memiliki format yang sama.# Syslog tidak dapat menjadi keluaran karena memerlukan logger terpisah.multi_delegating_logger = LogStashLogger.new( ketik: :multi_delegator, keluaran: [{ ketik: :file, jalur: 'log/development.log' },{ ketik: :udp, host: 'localhost', port: 5228 } ])# Menyeimbangkan pesan di antara beberapa keluaran.# Bekerja sama seperti multi delegator, namun secara acak memilih keluaran untuk dikirim setiap pesan.balancer_logger = LogStashLogger.new( jenis: :penyeimbang, keluaran: [{ ketik: :udp, host: 'host1', port: 5228 },{ ketik: :udp, host: 'host2', port: 5228 } ])# Mengirim pesan ke beberapa logger.# Gunakan ini jika Anda perlu mengirim format berbeda ke output berbeda.# Jika Anda perlu login ke syslog, Anda harus menggunakan ini.multi_logger = LogStashLogger.new( ketik: :multi_logger, keluaran: [{ ketik: :file, jalur: 'log/development.log', formatter: ::Logger::Formatter },{ ketik: :tcp, host: 'localhost', port: 5228, formatter: :json } ])# Pesan berikut ditulis ke port UDP 5228:logger.info 'test'# {"message":"test","@timestamp":"22-05-2014T09:37:19.204-07:00", "@version":"1","severity":"INFO","host":"[nama host]"}logger.error '{"message": "error"}'# {"message":"error","@timestamp":"22-05-2014T10:10:55.877-07:00","@version":"1","severity":"ERROR","host" :"[nama host]"}pesan logger.debug: 'test', foo: 'bar'# {"message":"test","foo":"bar","@timestamp":"22-05-2014T09:43:24.004-07:00","@version":"1","tingkat keparahan" :"DEBUG","host":"[nama host]"}logger.warn LogStash::Event.new(pesan: 'test', foo: 'bar')# {"message":"test","foo":"bar","@timestamp":"22-05-2014T16:44:37.364Z","@version":"1","severity":"PERINGATAN ","host":"[nama host]"}# Ditandai logginglogger.tagged('foo') { logger.fatal('bar') }# {"message":"bar","@timestamp":"26-05-2014T20:35:14.685-07:00","@version":"1","severity":"FATAL","host" :"[nama host]","tags":["foo"]}
Anda dapat menggunakan URI untuk mengonfigurasi logger logstash Anda, bukan hash. Ini berguna di lingkungan seperti Heroku di mana Anda mungkin ingin membaca nilai konfigurasi dari lingkungan tersebut. Skema URI adalah type://host:port/path?key=value
. Beberapa contoh konfigurasi URI diberikan di bawah ini.
udp://localhost:5228 tcp://localhost:5229 unix:///tmp/socket file:///path/to/file redis://localhost:6379 kafka://localhost:9092 stdout:/ stderr:/
Teruskan URI ke logstash logger Anda seperti:
# Membaca URI dari variabel lingkungan = LogStashLogger.new(uri: ENV['LOGSTASH_URI'])
Agar logstash dapat menerima dan mengurai peristiwa dengan benar, Anda perlu mengonfigurasi dan menjalankan pendengar yang menggunakan codec json_lines
. Misalnya, untuk menerima event melalui UDP pada port 5228:
masukan { udp {host => "0.0.0.0"port => 5228codec => json_lines }}
Input file dan Redis harus menggunakan codec json
. Untuk informasi lebih lanjut, baca dokumen Logstash.
Lihat direktori sampel untuk sampel konfigurasi lainnya.
Jika Anda menggunakan TCP maka ada opsi untuk menambahkan sertifikat SSL ke opsi hash saat inisialisasi.
LogStashLogger.baru(ketik: :tcp, port: 5228, ssl_certificate: "/path/to/certificate.crt")
Sertifikat dan kunci SSL dapat dibuat menggunakan
openssl req -x509 -batch -nodes -newkey rsa:2048 -keyout logstash.key -out logstash.crt
Anda juga dapat mengaktifkan SSL tanpa sertifikat:
LogStashLogger.baru(ketik: :tcp, port: 5228, ssl_enable: true)
Tentukan konteks SSL untuk memiliki kontrol lebih besar atas perilaku tersebut. Misalnya, atur mode verifikasi:
ctx = OpenSSL::SSL::SSLContext.newctx.set_params(verify_mode: OpenSSL::SSL::VERIFY_NONE)LogStashLogger.new(ketik: :tcp, port: 5228, ssl_context: ctx)
Konfigurasi Logstash berikut diperlukan untuk SSL:
masukan { tcp {host => "0.0.0.0"port => 5228codec => json_linesssl_enable => truessl_cert => "/path/to/certificate.crt"ssl_key => "/path/to/key.key" }}
Verifikasi nama host diaktifkan secara default. Tanpa konfigurasi lebih lanjut, nama host yang diberikan ke :host
akan digunakan untuk memverifikasi identitas sertifikat server.
Jika Anda tidak meneruskan :ssl_context
atau memberikan nilai palsu ke opsi :verify_hostname
, verifikasi nama host tidak akan terjadi.
Verifikasi nama host dari opsi :host
ctx = OpenSSL::SSL::SSLContext.newctx.cert = '/path/to/cert.pem'ctx.verify_mode = OpenSSL::SSL::VERIFY_PEERLogStashLogger.new ketik: :tcp, tuan rumah: 'logstash.example.com' pelabuhan: 5228, ssl_konteks: ctx
Verifikasi nama host yang berbeda dari opsi :host
LogStashLogger.baru ketik: :tcp, tuan rumah: '1.2.3.4' pelabuhan: 5228, ssl_konteks: ctx, verifikasi_namahost: 'server.example.com'
Nonaktifkan verifikasi nama host secara eksplisit
LogStashLogger.baru ketik: :tcp, tuan rumah: '1.2.3.4' pelabuhan: 5228, ssl_konteks: ctx, verifikasi_namahost: salah
LogStashLogger
secara default akan mencatat objek JSON dengan format di bawah ini.
{ "message":"Beberapa Pesan", "@timestamp":"29-01-2015T10:43:32.196-05:00", "@version":"1", "severity":"INFO", "host ":"nama host"}
Beberapa aplikasi mungkin perlu melampirkan metadata tambahan ke setiap pesan. LogStash::Event
dapat dimanipulasi secara langsung dengan menentukan blok customize_event
dalam konfigurasi LogStashLogger
.
config = LogStashLogger.configure lakukan |config| config.customize_event do |event|event["other_field"] = "some_other_value" akhir
Konfigurasi ini akan menghasilkan output berikut.
{"message": "Beberapa Pesan","@timestamp": "29-01-2015T10:43:32.196-05:00","@version": "1","severity": "INFO","host ": "nama host","other_field": "some_other_value"}
Blok ini memiliki akses penuh ke acara tersebut, sehingga Anda dapat menghapus kolom, mengubah kolom yang ada, dll. Misalnya, untuk menghapus stempel waktu default:
config = LogStashLogger.configure lakukan |config| config.customize_event lakukan |event|event.remove('@timestamp') akhir
Anda juga dapat menyesuaikan peristiwa berdasarkan per-logger dengan meneruskan objek yang dapat dipanggil (lambda atau proc) ke opsi customize_event
saat membuat logger:
LogStashLogger.baru(customize_event: ->(event){ event['other_field'] = 'other_field' })
Untuk perangkat yang membuat sambungan ke layanan jarak jauh, pesan log disangga secara internal dan dihapus di thread latar belakang. Jika ada masalah koneksi, pesan disimpan di buffer dan otomatis dikirim ulang hingga berhasil. Output yang mendukung penulisan batch (Redis dan Kafka) akan menulis pesan log secara massal dari buffer. Fungsionalitas ini diimplementasikan menggunakan fork Stud::Buffer. Anda dapat mengonfigurasi perilakunya dengan meneruskan opsi berikut ke LogStashLogger:
:buffer_max_items - Jumlah maksimum item yang akan di-buffer sebelum dibilas. Defaultnya adalah 50.
:buffer_max_interval - Jumlah detik maksimum untuk menunggu di antara pembilasan. Defaultnya adalah 5.
:drop_messages_on_flush_error - Jatuhkan pesan ketika ada kesalahan flush. Defaultnya salah.
:drop_messages_on_full_buffer - Jatuhkan pesan saat buffer penuh. Defaultnya adalah benar.
:sync - Hapus buffer setiap kali pesan diterima (pemblokiran). Defaultnya salah.
:buffer_flush_at_exit - Hapus pesan saat keluar dari program. Defaultnya adalah benar.
:buffer_logger - Logger untuk menulis pesan debug/kesalahan buffer. Defaultnya tidak ada.
Anda dapat mematikan buffering dengan menyetel sync = true
.
Harap perhatikan peringatan berikut terhadap perilaku ini:
Ada kemungkinan pesan log duplikat dikirim saat mencoba ulang. Untuk keluaran seperti Redis dan Kafka yang ditulis dalam batch, seluruh batch dapat dikirim ulang. Jika ini merupakan masalah, Anda dapat menambahkan bidang UUID ke setiap peristiwa untuk mengidentifikasinya secara unik. Anda dapat melakukan ini di blok customize_event
, atau dengan menggunakan filter UUID logstash.
Pesan log masih mungkin hilang. Ruby tidak akan langsung mendeteksi masalah koneksi TCP/UDP. Dalam pengujian saya, Ruby membutuhkan waktu sekitar 4 detik untuk menyadari bahwa pihak penerima tidak aktif dan mulai menaikkan pengecualian. Karena pendengar logstash melalui TCP/UDP tidak mengakui pesan yang diterima, tidak mungkin mengetahui pesan log mana yang akan dikirim ulang.
Ketika sync
dimatikan, Ruby mungkin melakukan buffering data secara internal sebelum menulis ke perangkat IO. Inilah sebabnya Anda mungkin tidak melihat pesan yang langsung ditulis ke soket UDP atau TCP, meskipun buffer LogStashLogger dihapus secara berkala.
Secara default, pesan akan dibuang ketika buffer sudah penuh. Hal ini dapat terjadi jika sumber output mati terlalu lama atau pesan log diterima terlalu cepat. Jika aplikasi Anda tiba-tiba terhenti (misalnya karena SIGKILL atau listrik padam), seluruh buffer akan hilang.
Anda dapat memperkecil kemungkinan hilangnya pesan dengan meningkatkan buffer_max_items
(sehingga lebih banyak peristiwa dapat diadakan di buffer), dan mengurangi buffer_max_interval
(untuk menunggu lebih sedikit waktu antar flush). Hal ini akan meningkatkan tekanan memori pada aplikasi Anda karena pesan log terakumulasi di buffer, jadi pastikan Anda telah mengalokasikan cukup memori untuk proses Anda.
Jika Anda tidak ingin kehilangan pesan saat buffer penuh, Anda dapat mengatur drop_messages_on_full_buffer = false
. Perhatikan bahwa jika buffer penuh, pesan log apa pun yang masuk akan diblokir, dan hal ini mungkin tidak diinginkan.
Semua keluaran logger mendukung pengaturan sync
. Ini analog dengan pengaturan "mode sinkronisasi" pada objek Ruby IO. Ketika disetel ke true
, output segera dihapus dan tidak di-buffer secara internal. Biasanya, untuk perangkat yang terhubung ke layanan jarak jauh, buffering adalah hal yang baik karena meningkatkan kinerja dan mengurangi kemungkinan kesalahan yang mempengaruhi program. Untuk perangkat ini, sync
default ke false
, dan disarankan untuk membiarkan nilai default. Anda mungkin ingin mengaktifkan mode sinkronisasi untuk pengujian, misalnya jika Anda ingin melihat pesan log segera setelah pesan tersebut ditulis.
Disarankan untuk mengaktifkan mode sinkronisasi untuk keluaran file dan soket Unix. Hal ini memastikan bahwa pesan log dari thread atau proses berbeda ditulis dengan benar pada baris terpisah.
Lihat #44 untuk lebih jelasnya.
Jika pengecualian terjadi saat menulis pesan ke perangkat, pengecualian tersebut dicatat menggunakan logger internal. Secara default, ini log ke $stderr. Anda dapat mengubah logger kesalahan dengan menyetel LogStashLogger.configuration.default_error_logger
, atau dengan meneruskan objek logger Anda sendiri di kunci konfigurasi :error_logger
saat membuat instance LogStashLogger.
LogStashLogger menyediakan dukungan untuk pembungkaman logger gaya Rails. Implementasinya diekstraksi dari Rails, namun tidak memiliki ketergantungan, sehingga dapat digunakan di luar aplikasi Rails. Antarmukanya sama seperti di Rails:
logger.silence(temporary_level) lakukan ...akhir
Secara default, LogStashLogger membuat logger yang memperluas kelas Logger
bawaan Ruby. Jika Anda memerlukan implementasi logger yang berbeda, Anda dapat menggunakan kelas yang berbeda dengan meneruskan kelas dengan opsi logger_class
.
Perhatikan bahwa untuk syslog, kelas Syslog::Logger
diperlukan dan tidak dapat diubah.
Mendukung Rel 4.2 dan 5.x.
Secara default, setiap pesan log Rails akan ditulis ke logstash dalam format LogStash::Event
JSON.
Untuk peristiwa logstash yang minimal dan lebih terstruktur, cobalah salah satu permata berikut:
lograge
tukang kebun
Saat ini permata ini menghasilkan string JSON, yang kemudian diurai oleh LogStashLogger. Versi mendatang dari permata ini berpotensi memiliki integrasi lebih dalam dengan LogStashLogger (misalnya dengan langsung menulis objek LogStash::Event
).
Tambahkan yang berikut ke config/environments/production.rb
Anda:
# Opsional, Rails menyetel default ke :infoconfig.log_level = :debug# Opsional, Rails 4 default ke true dalam pengembangan dan false di productionconfig.autoflush_log = true# Opsional, gunakan URI untuk mengonfigurasi. Berguna di Herokuconfig.logstash.uri = ENV['LOGSTASH_URI']# Opsional. Defaultnya adalah :json_lines. Jika ada beberapa keluaran,# semuanya akan menggunakan formatter yang sama.config.logstash.formatter = :json_lines# Opsional, logger yang akan mencatat kesalahan penulisan. Defaultnya adalah masuk ke $stderrconfig.logstash.error_logger = Logger.new($stderr)# Opsional, jumlah maksimum item yang akan di-buffer sebelum dibilas. Defaultnya adalah 50config.logstash.buffer_max_items = 50# Opsional, jumlah detik maksimum untuk menunggu di antara flushes. Defaultnya adalah 5config.logstash.buffer_max_interval = 5# Opsional, hapus pesan ketika terjadi kesalahan koneksi. Defaultnya adalah falseconfig.logstash.drop_messages_on_flush_error = false# Opsional, hapus pesan saat buffer penuh. Defaultnya adalah trueconfig.logstash.drop_messages_on_full_buffer = true
# Opsional, defaultnya adalah '0.0.0.0'config.logstash.host = 'localhost'# Opsional, defaultnya adalah :udp.config.logstash.type = :udp# Diperlukan, port untuk terhubung keconfig.logstash.port = 5228
# Opsional, defaultnya adalah '0.0.0.0'config.logstash.host = 'localhost'# Diperlukan, port untuk menghubungkan keconfig.logstash.port = 5228# Requiredconfig.logstash.type = :tcp# Opsional, mengaktifkan SSLconfig.logstash. ssl_enable = benar
# Diperlukanconfig.logstash.type = :unix# Diperlukanconfig.logstash.path = '/tmp/sock'
Jika Anda menggunakan Ruby 1.9, tambahkan Syslog::Logger
v2 ke Gemfile Anda:
gem 'SyslogLogger', '2.0'
Jika Anda menggunakan Ruby 2+, Syslog::Logger
sudah terpasang di perpustakaan standar.
# Diperlukanconfig.logstash.type = :syslog# Opsional. Defaultnya adalah 'ruby'config.logstash.program_name = 'MyApp'# Tingkat fasilitas default opsional. Hanya berfungsi di Ruby 2+config.logstash.facility = Syslog::LOG_LOCAL0
Tambahkan permata redis ke Gemfile Anda:
gem 'redis'
# Requiredconfig.logstash.type = :redis# Opsional, akan default ke 'logstash' listconfig.logstash.list = 'logstash'# Semua opsi lain diteruskan ke klien Redis# Opsi yang didukung termasuk host, port, path, kata sandi , url# Contoh:# Opsional, Redis akan default ke port 6379config.logstash.host = 'localhost'# Opsional, Redis akan default ke port 6379config.logstash.port = 6379
Tambahkan permata poseidon ke Gemfile Anda:
gem 'poseidon'
# Requiredconfig.logstash.type = :kafka# Opsional, akan default ke 'logstash' topicconfig.logstash.path = 'logstash'# Opsional, akan default ke 'logstash-logger' producerconfig.logstash.producer = 'logstash-logger '# Opsional, akan default ke localhost:9092 host/portconfig.logstash.hosts = ['localhost:9092']# Opsional, akan default ke 1s backoffconfig.logstash.backoff = 1
Tambahkan permata aws-sdk ke Gemfile Anda:
# aws-sdk >= 3.0 gem 'aws-sdk-kinesis' # aws-sdk < 3.0 gem 'aws-sdk'
# Requiredconfig.logstash.type = :kinesis# Opsional, akan default ke 'logstash' streamconfig.logstash.stream = 'my-stream-name'# Opsional, akan default ke 'us-east-1'config.logstash.aws_region = 'us-west-2'# Opsional, akan default ke variabel lingkungan AWS_ACCESS_KEY_IDconfig.logstash.aws_access_key_id = 'ASKASKHLD12341'# Opsional, akan default ke variabel lingkungan AWS_SECRET_ACCESS_KEYconfig.logstash.aws_secret_access_key = 'ASKASKHLD1234123412341234'
Tambahkan permata aws-sdk ke Gemfile Anda:
# aws-sdk >= 3.0 gem 'aws-sdk-firehose' # aws-sdk < 3.0 gem 'aws-sdk'
# Requiredconfig.logstash.type = :firehose# Opsional, akan default ke pengiriman 'logstash' streamconfig.logstash.stream = 'my-stream-name'# Opsional, akan default ke konfigurasi wilayah default AWS chainconfig.logstash.aws_region = ' us-west-2'# Opsional, akan default ke penyedia kredensial default AWS chainconfig.logstash.aws_access_key_id = 'ASKASKHLD12341'# Opsional, akan default ke penyedia kredensial default AWS chainconfig.logstash.aws_secret_access_key = 'ASKASKHLD1234123412341234'
# Requiredconfig.logstash.type = :file# Opsional, defaultnya adalah Rails log pathconfig.logstash.path = 'log/production.log'
# Diperlukanconfig.logstash.type = :io# Diperlukanconfig.logstash.io = io
# Diperlukanconfig.logstash.type = :multi_delegator# Diperlukanconfig.logstash.outputs = [ {ketik: :file,jalur: 'log/produksi.log' }, {ketik: :udp,port: 5228,host: 'localhost' }]
# Diperlukanconfig.logstash.type = :multi_logger# Diperlukan. Setiap logger mungkin memiliki formatter.config.logstash.outputs = [ {jenis: :file,jalur: 'log/produksi.log',formatter: ::Logger::Formatter }, {ketik: :udp,port: 5228,host: 'localhost' }]
Dalam aplikasi web, Anda dapat mencatat data dari permintaan HTTP (seperti header) menggunakan middleware RequestStore. Contoh berikut mengasumsikan Rails.
# di Gemfilegem 'request_store'
# di application.rbLogStashLogger.configure lakukan |config| config.customize_event do |event|event["session_id"] = RequestStore.store[:load_balancer_session_id] akhir
# di app/controllers/application_controller.rbbefore_filter :track_load_balancer_session_iddef track_load_balancer_session_id RequestStore.store[:load_balancer_session_id] = permintaan.headers["X-LOADBALANCER-SESSIONID"]end
Jika aplikasi Anda bercabang (seperti yang umum terjadi pada banyak server web), Anda perlu mengelola pembersihan sumber daya pada instans LogStashLogger Anda. Metode instan #reset
tersedia untuk tujuan ini. Berikut adalah contoh konfigurasi untuk beberapa server web umum yang digunakan dengan Rails:
Penumpang:
::PhusionPassenger.on_event(:starting_worker_process) lakukan |bercabang| Rails.logger.resetend
Puma:
# Di config/puma.rbon_worker_boot lakukan Rails.logger.resetend
Unicorn
# Di config/unicorn.rbafter_fork lakukan |server, pekerja| Rails.logger.resetend
Diverifikasi untuk bekerja dengan:
MRI Ruby 2.2 - 2.5
JRuby 9.x
Rubinius
Versi Ruby <2.2 sudah EOL dan tidak lagi didukung.
Itu tergantung pada kebutuhan spesifik Anda, tetapi sebagian besar aplikasi harus menggunakan default (UDP). Berikut kelebihan dan kekurangan masing-masing jenisnya:
UDP lebih cepat dari TCP karena tidak sinkron (api-dan-lupakan). Namun, ini berarti pesan log bisa hilang. Ini oke untuk banyak aplikasi.
TCP memverifikasi bahwa setiap pesan telah diterima melalui komunikasi dua arah. Ini juga mendukung SSL untuk transmisi pesan log yang aman melalui jaringan. Hal ini dapat memperlambat perayapan aplikasi Anda jika pendengar TCP sedang mengalami beban berat.
File mudah digunakan, tetapi Anda harus khawatir tentang rotasi log dan kehabisan ruang disk.
Menulis ke soket Unix lebih cepat daripada menulis ke port TCP atau UDP, namun hanya bekerja secara lokal.
Menulis ke Redis bagus untuk penyiapan terdistribusi yang menghasilkan banyak log. Namun, Anda akan memiliki bagian lain yang bergerak dan harus khawatir Redis kehabisan memori.
Menulis ke stdout hanya disarankan untuk tujuan debugging.
Untuk pembahasan lebih detail mengenai UDP vs TCP, saya sarankan membaca artikel ini: UDP vs. TCP
Jika Anda menggunakan perangkat yang didukung oleh objek Ruby IO (seperti file, soket UDP, atau soket TCP), perlu diketahui bahwa Ruby menyimpan buffer internalnya sendiri. Meskipun LogStashLogger mem-buffer pesan dan menghapusnya secara berkala, data yang ditulis ke objek IO dapat di-buffer oleh Ruby secara internal tanpa batas waktu, dan bahkan mungkin tidak ditulis hingga program dihentikan. Jika ini mengganggu Anda atau Anda perlu segera melihat pesan log, satu-satunya jalan keluar Anda adalah menyetel opsi sync: true
.
Aplikasi Anda mungkin mencoba mencatat data yang tidak dikodekan dengan cara yang valid. Jika ini terjadi, pustaka JSON standar Ruby akan memunculkan pengecualian. Anda mungkin dapat mengatasinya dengan menukar encoder JSON yang berbeda seperti Oj. Gunakan permata oj_mimic_json untuk menggunakan Oj untuk pembuatan JSON.
Heroku merekomendasikan untuk menginstal rails_12factor agar log dikirim ke STDOUT. Sayangnya, hal ini mengesampingkan LogStashLogger, sehingga mencegah log dikirim ke tujuan yang dikonfigurasi. Solusinya adalah menghapus rails_12factor
dari Gemfile Anda.
Ini kemungkinan besar bukan masalah dengan LogStashLogger, melainkan permata berbeda yang mengubah level log Rails.logger
. Hal ini terutama mungkin terjadi jika Anda menggunakan server berulir seperti Puma, karena permata sering kali mengubah level log Rails.logger
dengan cara yang tidak aman untuk thread. Lihat #17 untuk informasi lebih lanjut.
Jika Anda menggunakan keluaran UDP dan menulis ke pendengar logstash, kemungkinan besar Anda mengalami bug dalam implementasi UDP dari pendengar logstash. Tidak ada perbaikan yang diketahui saat ini. Lihat #43 untuk informasi lebih lanjut.
Kelemahan umum penggunaan TCP atau UDP adalah batas 65535 byte pada total ukuran pesan. Untuk mengatasi masalah ini, Anda harus memotong pesan dengan mengatur ukuran pesan maksimal:
LogStashLogger.konfigurasi lakukan |config| config.max_message_size = 2000 akhir
Ini hanya akan memotong bidang message
Acara LogStash. Jadi, pastikan Anda menyetel ukuran pesan maksimal secara signifikan kurang dari 65535 byte untuk memberi ruang bagi kolom lainnya.
Rails 3.2, MRI Ruby <2.2, dan JRuby 1.7 tidak lagi didukung karena telah di-EOL. Jika Anda menggunakan Ruby versi lama, Anda harus menggunakan 0.24 atau lebih rendah.
Kunci peristiwa source
telah diganti dengan host
agar lebih cocok dengan logstash terbaru.
Konstruktor (host, port, type)
sudah tidak digunakan lagi dan digantikan dengan konstruktor hash opsi.
LogStash::Event
menggunakan format v1 mulai versi 1.2+. Jika Anda menggunakan v1, Anda harus menginstal LogStashLogger versi 0.4+. Ini tidak kompatibel dengan LogStash::Event
v1.1.5 lama, yang menggunakan format v0.
Versi sebelumnya dari permata ini (<= 0.2.1) hanya mengimplementasikan koneksi TCP. Versi yang lebih baru (>= 0.3) juga mengimplementasikan UDP, dan menggunakannya sebagai default baru. Perlu diketahui jika Anda menggunakan konstruktor default dan masih memerlukan TCP, Anda harus menambahkan argumen tambahan:
# Sekarang defaultnya adalah UDP, bukan TCPlogger = LogStashLogger.new('localhost', 5228)# Secara eksplisit tentukan TCP alih-alih UDPlogger = LogStashLogger.new('localhost', 5228, :tcp)
David Butler
pctj101
Gary Rennie
Nick Ethier
Arron Mabrey
Jan Schulte
Kurt Preston
Chris Blatchley
Felix Bechstein
Vadim Kazakov
Anil Rhemtulla
Nikita Vorobei
petugas pemadam kebakaran1919
Mike Gunderloy
Vitaly Gorodetsky
Pengadilan Caldwell
Bibek Shrestha
Alex Ianus
Craig Baca
kaca
Bin Lan
Joao Fernandes
KerenElvis
Sergei Pyankov
Alec Hoey
Alexei Krasnoperov
Gabriel de Oliveira
Vladislav Syabruk
Vakula Matus
Garpu itu
Buat cabang fitur Anda ( git checkout -b my-new-feature
)
Komit perubahan Anda ( git commit -am 'Add some feature'
)
Dorong ke cabang ( git push origin my-new-feature
)
Buat Permintaan Tarik baru