<p>rsyslog mengasumsikan UTC jika TZ env var tidak disetel dan meleset menggunakan waktu lokal sistem yang sebenarnya</p>

Dibuat pada 17 Nov 2017  ·  10Komentar  ·  Sumber: rsyslog/rsyslog

Ketika pesan RFC3164 diproses (misalnya melalui input jarak jauh), mereka kekurangan informasi zona waktu (sayangnya, tetapi ini adalah standar lama). Meskipun demikian, asumsi yang paling umum/aman adalah bahwa waktu lokal diterapkan dan sumber berbagi zona waktu yang sama (tidak selalu benar, tetapi kasus yang lebih mungkin).

Saat menyampaikan pesan RFC3164 ke sistem lain sebagai RFC5424 (atau menggunakan %timestamp:::date-rfc3339% dalam template) _AND_ dengan TZ tidak disetel, rsyslog akan menganggapnya beroperasi di zona waktu UTC (bahkan jika sistem OS dan libc alternatif panggilan dapat digunakan untuk mengetahui zona waktu yang sebenarnya).

Perilaku yang diinginkan (ketika info zona waktu tidak ada di stempel waktu sumber)

rsyslog menemukan waktu lokal sistem dan menganggap sistem sumber berada di zona waktu yang sama.

Dan jika TZ env var tidak ditemukan, rsyslog harus mencatat dan/atau mengeluarkan pesan kesalahan yang menyatakan bahwa ini perlu diatur untuk memproses pesan tanpa info zona waktu. Atau, rsyslog dapat kembali menggunakan panggilan sistem seperti tzname di libc yang harus disediakan oleh sebagian besar sistem POSIX.

Perilaku sebenarnya

rsyslog mengabaikan waktu lokal sistem (jika variabel lingkungan TZ tidak disetel) dan menyembunyikan serta memproses stempel waktu menggunakan UTC.

Dampak

Jika sistem yang menjalankan syslog tidak memiliki TZ yang disetel, pesan tanpa info zona waktu yang direlai oleh rsyslog dalam format RFC5424 akan mengasumsikan UTC alih-alih waktu lokal dan menyebabkan relai syslog sistem-ke-sistem dalam zona waktu lain memiliki transformasi stempel waktu yang salah diterapkan.

Menyebabkan

RSyslog mengasumsikan TZ akan selalu disetel, tetapi ini mungkin bukan masalahnya. Misalnya distro besar seperti ubuntu tidak menyetel TZ secara default.

Melihat:

enhancement worked-on

Semua 10 komentar

mmmhhh... Pertanyaan jujur: rsyslog tidak menyentuh TZ. Jadi pengguna telah menghapusnya. Haruskah kita benar-benar mengesampingkan pengaturan (tidak) itu? @davidelang Saya juga menghargai komentar Anda

Distro besar seperti ubuntu tidak mengatur TZ secara default.

ummm... bukannya itu bug di distro?

ummm... bukannya itu bug di distro?

Jika ya, itu adalah bug yang muncul di Ubuntu 16.04.x ​​dan Red Hat 7.x sejauh yang saya lihat. Dan selama instalasi, saya melakukan pengaturan zona waktu. Saya tidak yakin apakah atau bagaimana TZ dianggap wajib? Apa yang wajib untuk OS POSIX adalah menyediakan panggilan sistem zona waktu tersebut (melalui libc)?

Sesuai Bagaimana pengaturan variabel lingkungan TZ menghindari ribuan panggilan sistem

cukup atur variabel lingkungan TZ ke :/etc/localtime (atau file zona waktu lain pilihan Anda) untuk suatu proses. Ini akan menyebabkan glibc menghindari panggilan sistem tambahan (dan tidak perlu).

Jadi menggunakan TZ dapat membantu glibc menjadi lebih efisien, tetapi menggunakan panggilan sistem di glibc (misalnya ketika daemon rsyslog dimulai) mungkin lebih aman daripada mengharapkan TZ env var disetel?

Juga, ini agak terkait dengan https://github.com/rsyslog/rsyslog/issues/424. Tapi saya mengerti selalu memeriksa / menggunakan panggilan sistem untuk zona waktu setiap pesan akan menjadi tidak efisien, maka mungkin hanya saat startup, tetapi sekali lagi, tidak yakin bagaimana waktu musim panas dapat menyebabkan rasa sakit dengan itu, jadi mungkin pemeriksaan berkala di tengah malam setiap hari juga masuk akal?

(* penafian, saya belum memeriksa bagaimana rsyslog mencari waktu lokal, tetapi logstash utilitas logging lainnya berhasil menyimpulkan waktu lokal sistem saya tanpa perlu TZ diatur)

Anda mungkin benar, tetapi Anda melihat saya cukup terkejut ;-)

maaf, perlu mengacak ke 8.33 -- akan mencoba melakukannya di sana sebagai salah satu hal pertama.

tampaknya menjadi masalah dalam wadah juga

Saya sekarang pergi melalui semua pilihan. Sepertinya cara terbaik untuk melakukannya sebenarnya adalah mengatur TZ=/etc/localtime pada startup rsyslog jika TZ tidak disetel dan file itu ada. Saya telah memverifikasi bahwa itu ada di semua versi Linux utama. Ini tidak akan berfungsi pada Solaris dll (saya pikir), tetapi dalam hal ini saya dapat mengatur TZ=UTC dan mengeluarkan pesan peringatan. Lebih baik daripada tidak...

@JPvRiel sekali lagi terima kasih telah mengangkat ini dan deskripsi serta tautan yang bagus. Sekarang saya akan melanjutkan dan mengimplementasikan proposal.

TZ=/etc/localtime

Terima kasih, perbaikan yang bagus. Cara saya mengatasinya (kasus penggunaan saya menjalankan rsyslog di buruh pelabuhan) adalah memastikan bahwa variabel env disetel.

Dua pembaruan yang terkait dengan ini demi anak cucu:

  1. Ketika saya mencatat masalah ini, masalah UTC adalah karena saya menjalankan rsyslog dalam sebuah wadah, dan sebenarnya Docker yang tampaknya memaksa UTC dalam wadah, bahkan jika OS Host memiliki set zona waktu yang tepat. Memeriksa TZ menangani masalah ini.
  2. Masih tidak yakin tentang Bagaimana pengaturan variabel lingkungan TZ menghindari ribuan panggilan sistem dan belum membandingkannya sendiri, tetapi akan menarik untuk menguji bersama dengan TimeRequery sebagai merdu untuk menangani biaya panggilan sistem waktu untuk imudp.

Utas ini telah dikunci secara otomatis karena tidak ada aktivitas terbaru setelah ditutup. Silakan buka edisi baru untuk bug terkait.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat