linux自定义log日志

linux自定义log日志

近期调式项目需要,要在设备上加入log功能,网上有了解到Linux下自带syslog,没有具体研究,好像需要配置。然后想自己实现一个log功能,于是开始整理思路:

  1. 代码中加入log点能够打印到文件;
  2. 文件达到一定大小自动切换到另外一个文件,两个文件交替使用;
  3. 保证实时性

一开始查找到一些把程序运行的打印直接打印到文件方法,如下:

1)假设我的程序是test,运行test

$ test > result.txt

这样printf的输出就存储在result.txt中了。

2)如果既想打印在终端,又想保存在文件,还可以使用tee命令

$ test | tee result.txt

3)还有一个方法就是使用fprintf函数了
以上1)、2)两种方式在普通测试的小程序上可以用,到了大的应用程序不是很方便,无法控制文件大小。方式3)使用的时候,需要重复打开关闭文件,考虑到打印的内容频率较高,遂放弃。


重新寻找方法,使用echo

首先打印到文件,其实就是自定义打印函数,把常用的printf改成自己的打印接口。

#define _PRTLOG
#ifdef _PRTLOG
#define PRI_LOG(fmt, args...)		PrtLog(eLogDebug,"[TEST] [%s: %d]  "fmt"", __func__, __LINE__, ##args);
#define PRI_ERR_LOG(fmt, args...)	PrtLog(eLogError,"\033[1;31m[TEST_ERR] [%s: %s: %d]  "fmt"  \033[0m\n", __FILE__, __func__, __LINE__, ##args)
#define PRI_LOG_FO(fmt, args...)	PrtLog(eLogFileOnly,"[TEST] [%s: %d]  "fmt"", __func__, __LINE__, ##args);
#else
#define PRI_LOG(fmt, args...)		
#define PRI_ERR_LOG(fmt, ...)
#define PRI_LOG_FO(fmt, args...)

然后就是实现PrtLog函数,下面代码中的SemTake、SemGive是linux下信号量的获取与释放,这里是重新封装了一下,也可以直接用linux的信号量接口。GetLogTime是获取系统时间,通过gettimeofday函数就可以获取到,这个在之前的文章中有提到。


/* **********************************************************************************
 * Name			: PrtLog
 * Description	:
 * Input		: 	
 *					priority	:level of log, LOG_ERR, LOG_DEBUG etc.
 * 					fmt			:format of message to log
 * 					...			:args follow by fmt
 * Output		:
 * Return		: 
 * Note			: 打印日志信息到文件,单次打印最大字符串长度1024
 * **********************************************************************************/
void PrtLog(int priority, char* fmt, ...)
{
	int nlogsize = 0;
	char abyTime[32] = {0};
	char abyCmd[ONE_MSG_MAX+64] = {0};
    char priVc[][9] = {"Emerg", "Alert", "Crit", "Error", "Warning", "Notice", "Info", "Debug", "FileOnly"};

	SemTake(&g_LogSem);//自定义部分
	
	memset(LogLastMsg, 0, ABOX_ONE_MSG_MAX);
	GetLogTime(abyTime);//自定义部分
    char* priPt = priority < 0 || priority >= sizeof(priVc)/sizeof(priVc[0]) ?
        "Unknow priority!" : priVc[priority];
    
	va_list argPt;
	unsigned Ln;
	
	va_start(argPt, fmt);  //now argPt is point to log's param:...
	
	Ln = snprintf(LogLastMsg, sizeof(LogLastMsg), "[%s][%s]: ", abyTime, priPt);
	
	Ln += vsnprintf(LogLastMsg + Ln, sizeof(LogLastMsg) - Ln, fmt, argPt);
	
	va_end(argPt);

    //choose the log which should be show on stderr
	if (priority < LOG_ERR || priority <= Log2Stderr)
    {
        fprintf(stderr, "%s\n", LogLastMsg);
    }
 
    //每次打印长度累加
	nlogsize = strlen(LogLastMsg);
	g_LogSize += nlogsize;
	//此处实现log自动切换
	if (0 == g_byCurLogFile)
	{
		//当前使用log0,大小超限切换到log1
		if (g_LogSize >= ABOX_LOG_MAX)
		{
			//清空log1
			sprintf(abyCmd, "echo -e \"log1 start\" > %s", LOG_PATH1);
			system(abyCmd);
			//写入log1 -e 启用解释反斜杠的转义功能 -n 不尾随换行符
			sprintf(abyCmd, "echo -e -n \"%s\" >> %s", LogLastMsg, LOG_PATH1);
			system(abyCmd);

			g_LogSize = nlogsize;
			g_byCurLogFile = 1;
		}
		else
		{
			//写入log0
			sprintf(abyCmd, "echo -e -n \"%s\" >> %s", LogLastMsg, LOG_PATH0);	
			system(abyCmd);
		}
	}
	else
	{
		//当前使用log1,大小超限切换到log0
		if (g_LogSize >= LOG_MAX)
		{
			//清空log0
			sprintf(abyCmd, "echo -e \"log0 start\" > %s", LOG_PATH0);
			system(abyCmd);
			//写入log1
			sprintf(abyCmd, "echo -e -n \"%s\" >> %s", LogLastMsg, LOG_PATH0);
			system(abyCmd);

			g_LogSize = nlogsize;
			g_byCurLogFile = 0;
		}
		else
		{
			//写入log1
			sprintf(abyCmd, "echo -e -n \"%s\" >> %s", LogLastMsg, LOG_PATH1);	
			system(abyCmd);
		}
	}

	if (eLogFileOnly != priority)//头文件定义priority枚举
	{
		//此处打印到终端
		printf("%s",LogLastMsg);
	}
 	SemGive(&g_LogSem);//自定义部分
    if (priority <= LOG_ERR)
    {
        exit(-1);
    }
	
    return ;
}

以上代码通过echo打印到文件,通过一个全局变量统计当前log文件的大小,超过后自动切换到另一个文件。
一开始使用fprintf函数,在初始化时,打开文件,之后一直不再关闭,直到文件大小超限。这种方式出现一个问题,fprintf输出到文件流中,若不关闭文件,每次都要在缓存中满1024个字节后,才会打印到文件,这就使得log日志不再具有实时性。后来又改成了echo的方式,使用这种方式,需要在初始化时,创建好两个log文件。

以上代码加入文件,就可以在自己 的代码中调用
PRI_LOG
打印log到终端和文件
PRI_ERR_LOG
打印出错信息到终端和文件
PRI_LOG_FO
只打印log到文件


欢迎大家补充,使用中有什么问题可以留言一起交流。
2020年9月3日星期四

参考文章:https://blog.csdn.net/aidixi4007/article/details/101152366

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Eventlog Analyzer日志管理系统、日志分析工具、日志服务器的功能及作用     Eventlog Analyzer是用来分析和审计系统及事件日志的管理软件,能够对全网范围内的主机、服务器、网络设备、数据库以及各种应用服务系统等产生的日志,进行全面收集和细致分析,通过统一的控制台进行实时可视化的呈现。     通过定义日志筛选规则和策略,帮助IT管理员从海量日志数据中精确查找关键有用的事件数据,准确定位网络故障并提前识别安全威胁,从而降低系统宕机时间、提升网络性能、保障企业网络安全。 一、日志管理 保障网络安全 Windows系统日志分析 Syslog日志分析 应用程序日志分析 Windows终端服务器日志监控 Syslog服务器 通用日志解析 & 索引(ULPI)技术 事件日志监控 云设施日志监控 数据库审计 应用程序日志分析 监控和分析应用日志 IIS Web服务器日志分析 IIS FTP服务器日志分析 DHCP Windows应用日志分析 DHCP Linux应用日志分析 MS SQL数据库日志分析 Oracle数据库日志分析 Apache Web服务器日志分析 打印机服务器日志分析 IT合规性审计报表 满足合规性审计需要 合规性审计 PCI合规性报表 ISO 27001合规性报表 FISMA合规性报表 HIPAA合规性报表 SOX合规性报表 GLBA合规性报表 新法规合规性报表 自定义合规性报表 系统与用户监控日志报表 及时了解事件活动 内建报表 自定义报表 微软IIS服务器日志报表 IBM AS/400日志报表 VMware服务器日志报表 活动目录日志报表 特权用户监控报表 用户会话监控 事件日志监控 - 问答报表 历史事件趋势 搜索结果报表 安全信息管理 管理网络安全信息 无代理的采集日志方式 基于代理的采集日志方式 日志搜索 日志分析 日志归档 日志取证 日志导入 用户认证 安全管理服务提供商(MSSP) 适用于MSSP的日志管理方案 操控板与用户视图 个性化界面 安全信息和事件管理(SIEM) 全面保证网络及IT安全 实时事件关联 安全日志管理 服务器日志管理 日志管理 文件完整性监控 安全信息和事件管理(SIEM) 告警与通知 及时发现网络故障问题 实时告警 邮件、短信通知或运行程序 集成第三方工具 扩展管理 EventLog Analyzer API
要在Linux上安装Graylog,可以按照以下步骤进行操作: 1. 首先,安装Docker,这是运行Graylog所需的容器化平台。可以根据具体的Linux发行版来选择适合的安装方法。 2. 安装完成Docker后,可以通过Docker Compose来配置和管理Graylog。创建一个名为docker-compose.yml的文件,可以在其中添加以下内容: ``` version: '3' services: graylog: image: graylog/graylog:4.0 environment: - GRAYLOG_PASSWORD_SECRET=your_password_secret - GRAYLOG_ROOT_PASSWORD_SHA2=your_password_hash - GRAYLOG_HTTP_EXTERNAL_URI=http://your_graylog_domain:9000/ ports: - 9000:9000 - 1514:1514 - 514:514 volumes: - graylog_journal:/usr/share/graylog/data/journal networks: - graylog_network volumes: graylog_journal: networks: graylog_network: ``` 3. 修改Graylog的配置文件,可以使用以下命令打开配置文件: ``` sudo vi /etc/graylog/server/server.conf ``` 在配置文件中,可以根据需要进行一些自定义设置,例如设置日志存储位置、调整内存分配等。 4. 启动Graylog容器,可以使用以下命令启动容器: ``` sudo docker-compose up -d ``` 5. 检查Graylog是否成功启动,可以使用以下命令检查是否有关于Graylog的活动服务: ``` sudo systemctl --type=service --state=active | grep graylog ``` 如果输出中包含Graylog相关的服务,则表示Graylog已成功启动。 6. 可以根据需要配置防火墙规则,确保Graylog的端口和所需的网络访问都不受限制。 通过按照上述步骤进行操作,就可以在Linux上成功安装和配置Graylog。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [graylog安装总结](https://blog.csdn.net/liuyij3430448/article/details/127647508)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [日志审计Graylog 4.2.11安装教程](https://blog.csdn.net/weixin_43886932/article/details/125678301)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值