linuxの下でC言語のプログラミングはlogログを印刷します


前言
linuxのログシステムは、linux上で開発されるために必要な一部の内容です.以前openstackを勉強していたとき、openstackコンポーネントのエラーをデバッグしたとき、先生はログのエラーをたくさん見て、ここから手がかりを見つけてからプロファイルを修正すると言いました.その結果、多くのエラーはコンポーネントに対応するログファイルが反映されて修正に成功したため、linuxログシステムを使用することはlinuxプログラミングを理解するのに役立ちます.
ログファイルの概要
ログは一般的に/var/logディレクトリの下にあります.このディレクトリの下には、次の重要なログファイルがあります./var/log/maillog:メールのやりとり情報を記録しますが、主にsendmailとdovecotで生成された情報を記録します./var/log/dmesg:起動開始から現在のカーネル検出プロセスで発生した情報を記録します.カーネルプログラミングのモジュールでprintk()を使用すると、関連情報がここに印刷されます./var/log/messages:システムで発生した重要な情報またはエラー情報は、このファイルに記録されます.システムでエラーが発生した場合、このファイルは参照する必要があるファイルの1つです./var/log/http:このファイルには主に各種のネットワークサービス情報が記録されています./var/log/cron:このログは通常の作業スケジューリングに関連しています.すなわちcrontabが実行されたかどうか,実行中にエラーが発生したかどうかは,この日に現れる.
ログファイルの印刷
上記のログは、システムプロセスが印刷したログです.どうやって自分のログを印刷できますか?
まず、ニーズが何なのか、カーネルで印刷されているのかを明らかにします.それとも非カーネルアプリケーションで印刷されますか?
1.カーネル印刷ログ
カーネルモジュールを使用したことのある多くの友人は、linuxカーネルモジュールでプログラミングする場合は、簡単なprintk(「helloworld」)を使用することをよく知っていると信じています.ログを印刷する効果が得られます.以下にLSMを使用したlinuxカーネルモジュールのコードの一部を示します.モジュールをロードすると、動作のトリガごとに/var/log/dmesgファイルに対応するログ情報が印刷されます.
#include
#include
static unsigned long long count = 0;
int task_create_hook(unsigned long clone_flags)
  {
  	printk("[+geek] call task_create(). count=%llu
", ++count); return 0; } static struct security_operations geek_ops = { .name = "geek", .task_create = task_create_hook, }; static __init int geek_init(void) { printk("[+geek] loading...
"); if(register_security(&geek_ops)){ printk("[+geek] register faild
"); } return 0; } security_initcall(geek_init);

linuxでdmesgコマンドを使用すると、カーネル出力のログが表示されます.
2.カーネル以外のプログラミング印刷ログ
カーネル以外の環境でログを印刷するにはsyslogというツールを使用する必要があります(ubuntuバージョンとRed Hatバージョンには大きな違いがあり、ubuntuではsyslogが使用されていますが、Redhatやcentosなどのバージョンではrsyslogを使用してシステムに付属するsyslogを置き換えます).そこで、ログの一部を2つの部分に分けて分析します.
syslog
システムがsyslogを使用している場合は、次のテストコードを直接実行します.
#include 
int main(int argc, char **argv)
{
    openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);
    syslog(LOG_DEBUG,
           "This is a syslog test message generated by program '%s'
", argv[0]); closelog(); return 0; }

 
コンパイル実行可能プログラムを生成した後、1回のプログラムを実行すると、/var/log/syslogファイルに次のような情報が追加されます.Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program  './a.out'
   Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program './a.out'
このプログラムはsyslogライブラリ関数をインポートし、syslog関数を使用してsyslogファイルにログを出力します.最初のパラメータはメッセージの緊急レベルで、2番目のパラメータはメッセージのフォーマットで、その後はフォーマットに対応するパラメータです.printf関数と同じように使用します.のこのうちsyslogファイルが大きすぎると、下図のようにファイルを分割して圧縮します.
 
私たちのプログラムがシステムログ機能を使用する場合は、プログラムの起動時にopenlog関数を使用してsyslogdプログラムに接続し、後でsyslog関数でログを書くだけでいいです.
また注意しなければならないのは、ログを削除したい場合は、ログファイルを直接削除しないでください.そうすれば、システムがファイルを見つけられない可能性が高く、ログを印刷できなくなり、回復するのも面倒です.ログの内容を直接空にするとcat/dev/null>syslog
rsyslog
上記の方法でsyslogを印刷できない場合は、rsyslogをシステムに置き換えた可能性があります.このように、自分のログを印刷するには、rsyslogプロファイルを変更する必要があります.
/etc/rsyslogを開きます.conf
最後に自分のログのファイル名を書きます.
#Mylog
local2.* /var/log/mylog

保存を変更してrsyslogサービスを再起動:/etc/init.d/rsyslog restartまたはservice rsyslog restartまたはsystemctl restart rsyslog
 
次に、小さなテスト方法を作成して検証します.
 
#include 
int main(int argc, char **argv)
{
    openlog("MyLog", LOG_CONS | LOG_PID, LOG_LOCAL2);
    syslog(LOG_INFO,
           "This is a syslog test message generated by program '%s'
", argv[0]); closelog(); return 0; }

上記のコードをコンパイルして実行すると、/var/logディレクトリの下にmylogファイルが1つ増えます
 
何か問題がなければ、中身はLOG_INFO,This is a syslog test message generated by program ./.
今まで、私の知っているlinuxの下でc言語のプログラミングがログを印刷する方法はすでに述べました.皆さんとたくさん交流してほしいです.