利用systemd进行日志记录

本文介绍如何使用Systemd在Ubuntu环境下实现应用程序日志记录功能。通过定义不同级别的日志输出,结合配置文件设置,最终将日志信息输出到指定文件中。文中详细解释了从创建日志记录程序到配置日志轮转及rsyslog服务的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:主机操作系统:ubuntu16.04
功能实现:利用systemd实现应用的日志记录功能,并输出到指定文件夹
环境额外依赖:libsystemd-dev_229-4kord4_amd64.deb (依赖安装时可能还需要一些其它的依赖,按提示进行操作)
rsyslog分为7种信息等级:
0、debug-有调试信息的
1、info-一般信息日志
2、notice-具有重要性的普通条件的信息
3、warning/warn-警告界别
4、err/error-错误级别,阻止某个功能或者模块不能正常工作的信息
5、crit-严重级别,阻止整个系统或者整个软件不能正常工作的信息
6、alert-需要立刻修改的信息
7、emerg/panic-内核崩溃等严重信息
一、先创建一个mytest.c的主函数
#include <stdio.h>
#include <systemd/sd-journal.h>

#define MYTEST_LOG_EMERG	LOG_EMERG
#define MYTEST_LOG_ALERT	LOG_ALERT
#define MYTEST_LOG_CRIT		LOG_CRIT
#define MYTEST_LOG_ERR		LOG_ERR
#define MYTEST_LOG_WARNING	LOG_WARNING
#define MYTEST_LOG_NOTICE	LOG_NOTICE
#define MYTEST_LOG_INFO		LOG_INFO
#define MYTEST_LOG_DEBUG	LOG_DEBUG

#define MYTEST_LOG_LEVELMASK 7

#ifndef DEFAULT_LOGLEVEL
#define DEFAULT_LOGLEVEL	MYTEST_LOG_DEBUG
#endif                                                                      

#define mytest_log_emerg(...) mytest_log(MYTEST_LOG_EMERG, "[EMERG] " __VA_ARGS__)
#define mytest_log_alert(...) mytest_log(MYTEST_LOG_ALERT, "[ALERT] " __VA_ARGS__)
#define mytest_log_crit(...)  mytest_log(MYTEST_LOG_CRIT, "[CIRT] " __VA_ARGS__)
#define mytest_log_err(...)   mytest_log(MYTEST_LOG_ERR, "[ERROR] " __VA_ARGS__)
#define mytest_log_warning(...)   mytest_log(MYTEST_LOG_WARNING, "[WARNING] " __VA_ARGS__)
#define mytest_log_notice(...)    mytest_log(MYTEST_LOG_NOTICE, "[NOTICE] " __VA_ARGS__)
#define mytest_log_info(...)  mytest_log(MYTEST_LOG_INFO, "[INFO] " __VA_ARGS__)
#define mytest_log_debug(...) mytest_log(MYTEST_LOG_DEBUG, "[DEBUG] " __VA_ARGS__)

#define mytest_log(...) __mytest_log(__VA_ARGS__)
#define __mytest_log(level, ...) sd_journal_print(level, __VA_ARGS__)

int main()
{
	mytest_log_emerg("你好,世界!\n");
	mytest_log_alert("你好,世界!\n");
	mytest_log_crit("你好,世界!\n");
	mytest_log_err("你好,世界!\n");
	mytest_log_warning("你好,世界!\n");
	mytest_log_notice("你好,世界!\n");
	mytest_log_info("你好,世界!\n");
	mytest_log_debug("你好,世界!\n");
	return 0;
}

二、创建第一个config文件:mytestlog 放到/etc/logrotate.d目录下,所属用户和组均为root,权限为644.
/var/log/mytest.log{
	daily
	missingok
	compress
	delaycompress
	dateext
	notifempty
	create 777 root adm
}
参数说明:1、daily-指定转储周期为天 2、missingok-如果日志不存在或丢失,不报错  3、compress-通过gzip压缩转储以后的日志 4、delaycompress-通常和compress一起使用,转储的日志文件到下一次转储时才压缩 5、dateext-切换后的日志文件会附加上一个短横线和YYMMDD格式日期 6、notifempty-如果是空文件的话不转储。
三、创建第二个config文件:30-mytest.conf(后缀是conf的文件都可以,注意不要与目录下同名)放到/etc/rsyslog.d/目录下,所属用户和组均为root,权限为644
module(load="imjournal" PersistStateInterval="100" StateFile="/var/spool/rsyslog/imjournal.state") #load imjournal module
module(load="mmjsonparse") #load mmjsonparse module for structured logs

template(name="mytest" type="string"
		string="<%PRI-TEXT%>\t(%TIMESTAMP%) [%APP-NAME%:%procid%]%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
		)

$template FileFormat,"<%PRI-TEXT%> (%TIMESTAMP%) %syslogtag%%procid% %msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"

$template RizhiyiFormat_APPNAME,"<%pri%>%protocol-version% %timestamp% %HOSTNAME% %app-name% %procid% %msgid% [TOKEN@32473 tag=\"TAG\"] %msg%\n"

if $programname == 'mytest' then {
	action(type="mmjsonparse")
		action(type="omfile" file="/var/log/mytest.log" template="mytest")
}

说明:此配置文件指定日志输入文件/var/log/mytest.log
四、编译mytest.c(gcc mytest.c -o mytest -lsystemd),日志文件如下:/var/log/mytest.log
<user.emerg>	(Feb 16 14:20:44) [mytest:-] [EMERG] 你好,世界!
<user.alert>	(Feb 16 14:20:44) [mytest:-] [ALERT] 你好,世界!
<user.crit>	(Feb 16 14:20:44) [mytest:-] [CIRT] 你好,世界!
<user.err>	(Feb 16 14:20:44) [mytest:-] [ERROR] 你好,世界!
<user.warning>	(Feb 16 14:20:44) [mytest:-] [WARNING] 你好,世界!
<user.notice>	(Feb 16 14:20:44) [mytest:-] [NOTICE] 你好,世界!
<user.info>	(Feb 16 14:20:44) [mytest:-] [INFO] 你好,世界!
<user.debug>	(Feb 16 14:20:44) [mytest:-] [DEBUG] 你好,世界!

五、重启Rsyslog服务,日志采集开始工作

service rsyslog restart




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值