rsyslog、タグ内のファむル名、耇数行メッセヌゞ、フォヌルトトレランスを䜿甚したログ収集

画像







oxygen-icons.orgからの画像







挑戊する



ログファむルを䞭倮サヌバヌに転送したす。









条件むンフラストラクチャではLinuxサヌバヌのみが䜿甚されたす。









゜フトりェアの遞択



゚ラスティックビヌト、logstash、systemd-journal-remote、およびより倚くの優れたテクノロゞヌがある堎合、syslogサヌバヌが必芁なのはなぜですか









芳察 ナヌザヌはペヌゞ䞊の任意の入力フィヌルドにカヌド番号を入力しようずし、CVVずずもにサポヌトに通知するよう努めたす。







メッセヌゞ圢匏ずレガシヌ



TLDRすべおが悪い

Syslogは80幎代に登堎し、すぐにUnixラむクなシステムやネットワヌク機噚ぞのロギングの暙準になりたした。 芏栌はなく、誰もが既存の゜フトりェアずの互換性の原則に぀いお曞いおいたす。 2001幎に、IETFはRFC 3164「情報」ステヌタスの珟状を説明したした。 特に実装は非垞に異なるため、このドキュメントでは「UDPポヌト514に送信されるIPパケットの内容はsyslogメッセヌゞず芋なされるべきです」ず述べおいたす。 次に、RFC 3195で圢匏を暙準化しようずしたしたが、ドキュメントは成功しなかったこずが刀明したした。珟時点では、単䞀のラむブ実装はありたせん。 2009幎に、圌らはRFC 5424を採甚したした。RFC5424は構造化メッセヌゞを定矩したすが、これはだれもほずんど䜿甚したせん。







ここでは、rsyslogの著者であるRainer Gerhardsがこれに぀いお考えおいるこずを読むこずができたす。 実際、すべおの人がずにかくsyslogを実装しおおり、この倚様性をすべお解釈するタスクはsyslogサヌバヌにありたす。 たずえば、rsyslogには、CISCO IOSで䜿甚される圢匏を解析するための特別なモゞュヌルが含たれおいたす。最悪の堎合、5番目のバヌゞョンから、独自のパヌサヌを定矩できたす。







ネットワヌク経由で送信されるsyslogメッセヌゞは次のようになりたす。







<PRI> TIMESTAMP HOST TAG MSG
      
      







syslogプロトコルの代替RELP



単玔なTCP sysogの代わりにrsyslogを䜿甚しおホスト間でメッセヌゞが転送される堎合、 RELP -Reliable Event Logging Protocolを䜿甚できたす。 rsyslog甚に䜜成されたしたが、珟圚は他のいく぀かのシステムでサポヌトされおいたす。 特に、圌はLogstashずGraylogに理解されおいたす。 トランスポヌトにはTCPを䜿甚したす。 オプションで、TLSを䜿甚しおメッセヌゞを暗号化できたす。 プレヌンなTCP syslogよりも信頌性が高く、接続が切断されたずきにメッセヌゞを倱うこずはありたせん。 耇数行メッセヌゞで問題を解決したす。







Rsyslogの構成



2番目の䞀般的な代替であるsyslog-ngずは異なり、rsyslogは歎史的なsyslogd構成ず互換性がありたす。







 auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none /var/log/syslog *.* @syslog.example.net
      
      





rsyslogの機胜は以前の機胜よりもはるかに倧きいため、 $



蚘号で始たる远加のディレクティブを䜿甚しお、構成圢匏が拡匵されたした。







 $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat $WorkDirectory /var/spool/rsyslog $IncludeConfig /etc/rsyslog.d/*.conf
      
      





6番目のバヌゞョンから、siに䌌たRainerScript圢匏が登堎し、メッセヌゞ凊理の耇雑なルヌルを蚭定できるようになりたした。







これらはすべお埐々に行われ、叀い構成ずの互換性を考慮しお行われたため、最終的にはいく぀かの䞍快な瞬間が刀明したした。









これらの埮劙な点に぀たずかないようにそう、それらはドキュメントで説明されおいたすが、誰がすべおを読んでいたすか、簡単なルヌルに埓うべきです









蚭定圢匏の詳现に぀いおは、 こちらをご芧ください 。







メッセヌゞ凊理





→ メッセヌゞ凊理の詳现







構成䟋



カテゎリauthおよびauthprivのすべおのメッセヌゞを/var/log/auth.log



ファむルに曞き蟌み、凊理を続行したす。







 # legacy auth,authpriv.* /var/log/auth.log #   if ( $syslogfacility-text == "auth" or $syslogfacility-text == "authpriv" ) then { action(type="omfile" file="/var/log/auth.log") }
      
      





「haproxy」で始たるプログラム名を持぀すべおのメッセヌゞは、各メッセヌゞが曞き蟌たれた埌、バッファをディスクにフラッシュせずに/var/log/haproxy.log



ファむルに曞き蟌たれ、さらに凊理を停止したす。







 # legacy (      ,   ) :programname, startswith, "haproxy", -/var/log/haproxy.log & ~ #   if ( $programname startswith "haproxy" ) then { action(type="omfile" file="/var/log/haproxy.log" flushOnTXEnd="off") stop } #   if $programname startswith "haproxy" then -/var/log/haproxy.log &~
      
      





rsyslogd -N 1



チェック rsyslogd -N 1



その他の構成䟋 one 、 two 。







クラむアントファむル名を保存しおログを転送する



TAG



フィヌルドにファむル名を保存したす。 ファむルの単䞀レベルの散乱haproxy/error.log



を芳察しないように、名前にディレクトリを含めたいです。 ログがファむルからではなく、プログラムからsyslogに送信されたメッセヌゞから読み取られる堎合、暙準に準拠しおいないため、TAGに/



蚘号を曞き蟌むこずに同意しない堎合がありたす。 したがっお、それらを二重アンダヌスコアで゚ンコヌドし、ログサヌバヌで解析したす。







ネットワヌク経由でログを転送するためのテンプレヌトを䜜成したす。 32文字ログ名が長いより長いタグを持぀メッセヌゞを送信し、タむムゟヌンを瀺す暙準のタむムスタンプよりも正確なメッセヌゞを送信する必芁がありたす。 さらに、ロヌカル倉数$.suffix



がログファむルの名前に远加され、埌でその理由が明らかになりたす。 RainerScriptのロヌカル倉数はピリオドで始たりたす。 倉数が定矩されおいない堎合、空の文字列に展開されたす。







 template (name="LongTagForwardFormat" type="string" string="<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%$.suffix%%msg:::sp-if-no-1st-sp%%msg%")
      
      





次に、ネットワヌク経由でログを送信するために䜿甚されるRuleSetを䜜成したす。 入力に添付したり、ファむルを読み蟌んだり、関数ずしお呌び出すこずができたす。 はい、rsyslogでは、1぀のRuleSetを別のRuleSetから呌び出すこずができたす。 RELPを䜿甚するには、たず適切なモゞュヌルをダりンロヌドする必芁がありたす。







 # http://www.rsyslog.com/doc/relp.html module(load="omrelp") ruleset(name="sendToLogserver") { action(type="omrelp" Target="syslog.example.net" Port="20514" Template="LongTagForwardFormat") }
      
      





次に、ログファむルを読み取る入力を䜜成し、このRuleSetをそれに添付したす。







 input(type="imfile" File="/var/log/myapp/my.log" Tag="myapp/my.log" Ruleset="sendToLogserver")
      
      





読み取りファむルごずに、rsyslogはその䜜業ディレクトリ $WorkDirectory



ディレクティブで蚭定に状態ファむルを䜜成するこずに泚意しおください。 rsyslogがそこにファむルを䜜成できない堎合、rsyslogの再起動埌にログファむル党䜓が再送信されたす。







特定のタグを䜿甚しお䞀般的なsyslogにアプリケヌションが曞き蟌みを行い、それをファむルに保存しおネットワヌク経由で送信する堎合







 # Template to output only message template(name="OnlyMsg" type="string" string="%msg:::drop-last-lf%\n") if( $syslogtag == 'nginx__access:') then { # write to file action(type="omfile" file="/var/log/nginx/access" template="OnlyMsg") # forward over network call sendToLogserver stop }
      
      





これらのメッセヌゞの凊理を停止stop



、最埌のstop



必芁です。そうしないず、䞀般的なsyslogに分類されたす。 ちなみに、アプリケヌションが暙準/dev/log



nginxずhaproxyがこれを行うこずができたすに加えお、syslogに別のUnix゜ケットを遞択できる堎合、 imuxsockモゞュヌルを䜿甚するず、䞀般からのログを分析せずに、この゜ケットに個別の入力を䜜成し、必芁なRuleSetをアタッチできたすタグによるフロヌ。







ワむルドカヌドを介しお指定されたログファむルの読み取り



間奏







プログラマヌログサヌバヌで先月の初めのsomevendor.logログを芋぀けるこずができたせん。plizを参照しおください。

Devopsええず...本圓にそのようなログを曞くのでしょうか 譊告する必芁がありたす。 いずれにせよ、1週間以䞊経過しおいるものはすべおlogrotateを倱っおいたす。保存しないず、それはもう意味がありたせん。

プログラマヌ 激怒







アプリケヌションが倚くの異なるログを曞き蟌み、時々新しいログが衚瀺される堎合、毎回蚭定を曎新するのは䞍䟿です。 これを自動化したい。 imfileモゞュヌルは、ワむルドカヌドで指定されたファむルを読み取り、ファむルパスをメッセヌゞメタデヌタに保存できたす。 確かに、パスは完党なたたであり、そこから取埗する必芁がある最埌のコンポヌネントのみが必芁です。 ずころで、ここでは倉数$.suffix









 input(type="imfile" File="/srv/myapp/logs/*.log" Tag="myapp__" Ruleset="myapp_logs" addMetadata="on") ruleset(name="myapp_logs") { # http://www.rsyslog.com/doc/v8-stable/rainerscript/functions.html # re_extract(expr, re, match, submatch, no-found) set $.suffix=re_extract($!metadata!filename, "(.*)/([^/]*)", 0, 2, "all.log"); call sendToLogserver }
      
      





ワむルドカヌドは、imfile inotify



モヌドでのみサポヌトされたすこれはデフォルトモヌドです。 バヌゞョン8.25.0以降、ファむル名ずパスの䞡方でワむルドカヌドがサポヌトされおいたす/ var / log / / .log。







耇数行メッセヌゞ



耇数行メッセヌゞを含むログファむルを操䜜するために、imfileモゞュヌルには3぀のオプションがありたす。









最初の2぀のオプションには、操䜜のinotify



モヌドで問題があり、必芁に応じお、3番目のオプションは察応する正芏衚珟に簡単に眮き換えられたす。 耇数行のログの読み取りには、埮劙な点が1぀ありたす。 通垞、新しいメッセヌゞの兆候は最初にあり、次のメッセヌゞが始たるたでプログラムが最埌のメッセヌゞの曞き蟌みを終了したこずを確認するこずはできたせん。 このため、最埌のメッセヌゞが送信されるこずはありたせん。 これを回避するために、 readTimeout



を蚭定したす。その埌、メッセヌゞは完了したず芋なされ、送信されたす。







 input(type="imfile" File="/var/log/mysql/mysql-slow.log" # http://blog.gerhards.net/2013/09/imfile-multi-line-messages.html startmsg.regex="^# Time: [0-9]{6}" readTimeout="2" # no need to escape new line for RELP escapeLF="off" Tag=" mysql__slow.log" Ruleset="sendToLogserver")
      
      





サヌバヌ



サヌバヌ䞊で、送信されたログを受け入れ、送信ホストのIPず受信時間に埓っおディレクトリに分類する必芁がありたす /srv/log/192.168.0.1/2017-02-06/myapp/my.log



メッセヌゞの内容に応じおログファむル名を蚭定するために、テンプレヌトを䜿甚するこずもできたす。 テンプレヌトを䜿甚する前に、 $.logpath



倉数を$.logpath



内に蚭定する必芁がありたす。







 template(name="RemoteLogSavePath" type="list") { constant(value="/srv/log/") property(name="fromhost-ip") constant(value="/") property(name="timegenerated" dateFormat="year") constant(value="-") property(name="timegenerated" dateFormat="month") constant(value="-") property(name="timegenerated" dateFormat="day") constant(value="/") property(name="$.logpath" ) }
      
      





必芁なモゞュヌルをロヌドしお$EscapeControlCharactersOnReceive



オフにしたす。そうしないず、受信したログですべおの改行が\n



眮き換えられたす







 # Accept RELP messages from network module(load="imrelp") input(type="imrelp" port="20514" ruleset="RemoteLogProcess") # Default parameters for file output. Old-style global settings are not working with new-style actions module(load="builtin:omfile" FileOwner="syslog" FileGroup="adm" dirOwner="syslog" dirGroup="adm" FileCreateMode="0640" DirCreateMode="0755") # Module to remove 1st space from message module(load="mmrm1stspace") # http://www.rsyslog.com/doc/v8-stable/configuration/input_directives/rsconf1_escapecontrolcharactersonreceive.html # Print recieved LF as-it-is, not like '\n'. For multi-line messages # Default: on $EscapeControlCharactersOnReceive off
      
      





ここで、受信ログを解析しおそれらをフォルダヌに配眮するRuleSetを䜜成したす。 ロギングをsyslogのみに䟝存するサヌビスは、メッセヌゞ時間の節玄を期埅しおいたす。 したがっお、暙準ファシリティで到着したログをsyslog圢匏で保存し、ファシリティlocal0-local7で到着したログに぀いおは、 TAG



フィヌルドからログ名を取埗し、syslogフィヌルドを残さずにメッセヌゞ自䜓のみを蚘録したす。 メッセヌゞに貌り付けられたスペヌスの問題は、RELPに残りたす。これは、メッセヌゞの解析段階で発生するため、このギャップを削枛したす。







パフォヌマンスを向䞊させるために、非同期的に蚘述したす asyncWriting="on"



ず倧きなバッファヌioBufferSize=64k



たす。 メッセヌゞを受信するflushOnTXEnd="off"



埌flushOnTXEnd="off"



バッファヌをflushOnTXEnd="off"



たせんが、ログサヌバヌにログが非垞に迅速に衚瀺されるように、1秒ごずにこれを行いたす flushInterval="1"



。







 ruleset(name="RemoteLogProcess") { # For facilities local0-7 set log filename from $programname field: replace __ with / # Message has arbitary format, syslog fields are not used if ( $syslogfacility >= 16 ) then { # Remove 1st space from message. Syslog protocol legacy action(type="mmrm1stspace") set $.logpath = replace($programname, "__", "/"); action(type="omfile" dynaFileCacheSize="1024" dynaFile="RemoteLogSavePath" template="OnlyMsg" flushOnTXEnd="off" asyncWriting="on" flushInterval="1" ioBufferSize="64k") # Logs with filename defined from facility # Message has syslog format, syslog fields are used } else { if (($syslogfacility == 0)) then { set $.logpath = "kern"; } else if (($syslogfacility == 4) or ($syslogfacility == 10)) then { set $.logpath = "auth"; } else if (($syslogfacility == 9) or ($syslogfacility == 15)) then { set $.logpath = "cron"; } else { set $.logpath ="syslog"; } # Built-in template RSYSLOG_FileFormat: High-precision timestamps and timezone information action(type="omfile" dynaFileCacheSize="1024" dynaFile="RemoteLogSavePath" template="RSYSLOG_FileFormat" flushOnTXEnd="off" asyncWriting="on" flushInterval="1" ioBufferSize="64k") } } # ruleset
      
      





信頌できるメッセヌゞ配信。 キュヌ



画像







k-max.nameブログの画像







䞀郚のアクションでは、ネットワヌク経由でログを送信したり、デヌタベヌスに曞き蟌んだりするなど、実行が遅くなったり、䞀時停止したりするこずがありたす。 メッセヌゞを倱い、次のアクションに干枉しないようにするために、 キュヌを䜿甚できたす 。 各アクションには垞にメッセヌゞキュヌが割り圓おられたす。デフォルトでは、サむズはれロのダむレクトキュヌです。 すべおの入力メッセヌゞから受信したメッセヌゞのメむンキュヌはただありたすが、蚭定するこずもできたす。







キュヌの皮類ディスク、メモリ、および最も興味深いオプションは、ディスクアシストメモリキュヌを組み合わせたものです。 このようなキュヌはメモリを䜿甚し、メモリ内のキュヌがいっぱいの堎合、たたはサヌビスのリブヌト時に未送信メッセヌゞを保存する必芁がある堎合、ディスクの䜿甚を開始したす。 メッセヌゞは、キュヌ内のメッセヌゞの数がqueue.highwatermark



に達するずディスクに曞き蟌たれ始め、その数がqueue.lowwatermark



䞋がるずディスクぞの保存が停止されたす。 サヌビスのプリロヌド䞭に未送信メッセヌゞをディスクに保存するには、 queue.saveonshutdown="on"



指定する必芁がありたす。







ネットワヌクを介したログの送信たたはデヌタベヌスぞの曞き蟌みが倱敗した堎合、アクションは䞭断されたす。 rsyslogは、詊行ごずに増加する特定の間隔でActionの再開を詊みたす。 問題を解決した埌すぐにログを転送するには、 action.resumeRetryCount="-1"



無制限ずキュヌを停止する間隔をaction.resumeInterval="10"



に蚭定する必芁がありたす。 アクションパラメヌタの詳现をご芧ください 。







キュヌを持぀クラむアントのRuleSetは次のようになりたす。







 ruleset(name="sendToLogserver") { # Queue: http://www.rsyslog.com/doc/v8-stable/concepts/queues.html#disk-assisted-memory-queues # Disk-Assisted Memory Queue: queue.type="LinkedList" + queue.filename # queue.size - max elements in memory # queue.highwatermark - when to start saving to disk # queue.lowwatermark - when to stop saving to disk # queue.saveonshutdown - save on disk between rsyslog shutdown # action.resumeRetryCount - number of retries for action, -1 = eternal # action.resumeInterval - interval to suspend action if destination can not be connected # After each 10 retries, the interval is extended: (numRetries / 10 + 1) * Action.ResumeInterval action(type="omrelp" Target="syslog.example.net" Port="20514" Template="LongTagForwardFormat" queue.type="LinkedList" queue.size="10000" queue.filename="q_sendToLogserver" queue.highwatermark="9000" queue.lowwatermark="50" queue.maxdiskspace="500m" queue.saveonshutdown="on" action.resumeRetryCount="-1" action.reportSuspension="on" action.reportSuspensionContinuation="on" action.resumeInterval="10") }
      
      





これで、ログサヌバヌを安党にリロヌドできたす。メッセヌゞはキュヌに保存され、利甚可胜になったずきに送信されたす。







泚意ネットワヌクの埩元埌にキュヌからメッセヌゞを送信する堎合、それらの盞察的な順序に違反する可胜性がありたすコメントのzystemに感謝したす 。 rsyslogの䜜成者は、これは予想される動䜜であるず答えたした。詳现に぀いおは、 http  //www.gerhards.net/download/LinuxKongress2010rsyslog.pdfを参照しおください セクション7「同時実行関連の最適化」。 芁するに、マルチスレッドキュヌ凊理でメッセヌゞの順序を厳密に維持しようずするず、スレッドブロッキングが必芁になるため、パフォヌマンスが䜎䞋したす。 厳密なメッセヌゞシヌケンスの抂念は、䞀郚のタむプのトランスポヌト、マルチスレッドゞェネレヌタ、およびメッセヌゞレシヌバでは意味をなさない堎合がありたす。







耐障害性



前のアクションが䞀時停止された堎合にのみ実行するようにアクションを構成できたす description 。 これにより、フェヌルオヌバヌ構成を構成できたす。 䞀郚のアクションは、トランザクションを䜿甚しおパフォヌマンスを向䞊させたす。 この堎合、成功たたは倱敗は、メッセヌゞがすでに凊理されおいる堎合、トランザクションが完了した埌にのみ認識されたす。 これにより、フェヌルオヌバヌアクションを呌び出さずに䞀郚のメッセヌゞが倱われる可胜性がありたす。 これを防ぐには、パラメヌタqueue.dequeuebatchsize="1"



デフォルトでは16を蚭定する必芁がありたす。これにより、パフォヌマンスが䜎䞋する可胜性がありたす。







 ruleset(name="sendToLogserver") { action(type="omrelp" Target="syslog1.example.net" Port="20514" Template="LongTagForwardFormat") action(type="omrelp" Target="syslog2.example.net" Port="20514" Template="LongTagForwardFormat" action.execOnlyWhenPreviousIsSuspended="on" queue.dequeuebatchsize="1") }
      
      





実皌働環境ではこの機胜をただ詊しおいたせん。







Logrotateむンタラクション



rsyslog自䜓によっお曞き蟌たれたログ



smth.log



、デフォルトのスキヌムを䜿甚しおsmth.log



したすsmth.log



倉曎され、新しいsmth.log



が䜜成されたす。 回転埌のアクションでは、SIGHUPをrsyslogdプロセスに送信する必芁がありたす。 : rsyslog SIGHUP, -.







 /var/log/someapp/*.log{ weekly missingok rotate 5 create 0644 syslog adm sharedscripts postrotate test -s run/rsyslogd.pid && kill -HUP $(cat /run/rsyslogd.pid) # postrotate script should always return 0 true endscript }
      
      





, rsyslog



, (SIGHUP - ), . rsyslog inode .







logrotate copytruncate



, smth.log



smth.log.1



. rsyslog ( , ). 8.16.0, imfile



reopenOnTruncate



(- "off"



, "on"



). rsyslog (inode , ). "", . 8.16.0, copytruncate



SIGHUP rsyslogd post-rotate action.







: Debian/Ubuntu logrotate , — . /etc/cron.daily/logrotate



.







たずめ



. , syslog. . - . , .







rsyslog v8, . Ubuntu ppa adiscon/v8-stable . CentOS/RHEL .







PS







UPD: , zystem .







UPD2: logrotate.








All Articles