log4c日志库的用法,再封装及其完整例子
找了多篇文章,发现都讲的不怎么简明。自己摸索了下,记录如下:
Log4c中有三个重要的概念, Category, Appender, Layout。
Category用于区分不同的Logger, 其实它就是个logger。在一个程序中我们可以通过Category来指定很多的Logger,用于不同的目的。
Appdender用于描述输出流,通过为Category来指定一个Appdender,可以决定将log信息来输出到什么地方去,比如stdout, stderr, 文件, 或者是socket等等
Layout用于指定日志信息的格式,通过为Appender来指定一个Layout,可以决定log信息以何种格式来输出,比如是否有带有时间戳, 是否包含文件位置信息等,以及他们在一条log信息中的输出格式的等。
转载请注明出处:http://blog.csdn.net/fdl19881/article/details/8192363
例子:
系统:ubuntu12.10 .
准备:
安装log4c库, sudo apt-get install liblog4c-dev liblog4c-doc
别的系统请百度/GOOGLE找相关编译安装当。log4c官网:http://log4c.sourceforge.net/index.html
文件:
log.h log.c 自己将log4c重新封装的函数
test-log.c 测试用的主函数
log4crc 配置文件(xml,照着写就行)
//log.h
#ifndef _LOG_H_
#define _LOG_H_#include <string.h>
#include <stdlib.h>#ifdef __cplusplus
extern "C"
{
#endif#include "log4c.h"#ifdef __cplusplus
}
#endif#define LOG_PRI_ERROR LOG4C_PRIORITY_ERROR
#define LOG_PRI_WARN LOG4C_PRIORITY_WARN
#define LOG_PRI_NOTICE LOG4C_PRIORITY_NOTICE
#define LOG_PRI_DEBUG LOG4C_PRIORITY_DEBUG
#define LOG_PRI_TRACE LOG4C_PRIORITY_TRACEextern int log_open(const char *category);
extern void log_message(int priority ,const char* fmt, ...);
extern void log_trace(const char *file , int line , const char *func, const char *fmt ,...);
extern int log_close();#define LOG_ERROR(fmt , args...) \log_message(LOG_PRI_ERROR, fmt, ##args)
#define LOG_WARN(fmt, args...) \log_message(LOG_PRI_WARN, fmt , ##args)
#define LOG_NOTICE(fmt , args...) \log_message(LOG_PRI_NOTICE, fmt , ##args)
#define LOG_DEBUG(fmt , args...) \log_message(LOG_PRI_DEBUG, fmt , ##args)
#define LOG_TRACE(fmt,args...) \log_trace(__FILE__ , __LINE__ , __FUNCTION__ , fmt ,## args)#endif
//log.c
#include <log4c.h>
#include <assert.h>
#include "log.h"static log4c_category_t *log_category = NULL;int log_open(const char *category)
{if (log4c_init() == 1){return -1;}log_category = log4c_category_get(category);return 0 ;
}void log_message(int priority , const char *fmt , ...)
{va_list ap;assert(log_category != NULL);va_start(ap, fmt);log4c_category_vlog(log_category , priority , fmt , ap);va_end(ap);
}void log_trace(const char *file, int line, const char *fun, const char *fmt , ...)
{char new_fmt[2048];const char *head_fmt = "[file:%s, line:%d, function:%s]"; va_list ap;int n;assert(log_category != NULL);n = sprintf(new_fmt, head_fmt , file , line , fun);strcat(new_fmt + n , fmt);va_start(ap , fmt);log4c_category_vlog(log_category , LOG4C_PRIORITY_TRACE, new_fmt , ap);va_end(ap);
}int log_close()
{return (log4c_fini());
}
//test-log.c
#include <stdio.h>
#include "log.h"int main(void)
{log_open("<span style="color: rgb(51, 51, 51); line-height: 20px;">mycat</span>");LOG_TRACE("trace");LOG_ERROR("error");LOG_WARN("warn");LOG_NOTICE("notice");LOG_DEBUG("hello log4c!");log_close();return 0;
}
//配置文件,默认名为log4crc
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE log4c SYSTEM ""><log4c version="1.2.1"><config><bufsize>0</bufsize><debug level="2"/><nocleanup>0</nocleanup><reread>1</reread></config><!-- root category ========================================= --><category name="root" priority="notice"/><category name="mycat" priority="debug" appender="stdout"/><!-- default appenders ===================================== --><appender name="stdout" type="stream" layout="basic"/><appender name="stderr" type="stream" layout="dated"/><appender name="syslog" type="syslog" layout="basic"/><!-- default layouts ======================================= --><layout name="basic" type="basic"/><layout name="dated" type="dated"/></log4c>
编译命令:
gcc test-log.c log.c -o test-log -llog4c
运行效果
./test-log
[stdout] TRACE mycat - [file:test-log.c, line:7, function:main]trace
[stdout] ERROR mycat - error
[stdout] WARN mycat - warn
[stdout] NOTICE mycat - notice
[stdout] DEBUG mycat - hello log4c!
讲解:
关于log.h ,log.c封装的内容大家可以看看,用到了可变参数宏,可变参数这些。百度一下,就有很多人讲解了。这里就不说了。
log.h与log.c里面用法也很简单
log_open("category_name"); //category_name一定得是log4crc里面已经定义的category.
关于配置文件log4crc
更复杂的配置参见:http://xueqi.iteye.com/blog/1570013
配置文件的搜索是由LOG4C_RCPATH环境变量决定。搜索的配置文件名为log4crc(不知道能否改变,没研究过)
配置文件中category的priority不知道是什么意思,,反正好像没什么用。不管设置成什么,好像都不影响。
环境变量:
LOG4C_RCPATH
holds the path to the mainlog4crc
configuration file #环境变量若未设置,则在工作目录(一般为运行目录)搜索log4crc配置文件. 如果设置了此变量,则所以用log4c库的程序都会使用此路径下的log4c配置文件(可根据category区分).LOG4C_PRIORITY
holds the"root"
category priority #改变root的priority,,LOG4C_APPENDER
holds the"root"
category appender #改变root的appender,,因为root默认没设置appender.
log4c日志库的用法,再封装及其完整例子相关推荐
- spdlog 日志库学习,简易封装
spdlog wiki:https://github.com/gabime/spdlog/wiki 别人的学习笔记:https://www.cnblogs.com/oucsheep/p/8426548 ...
- 【OCP-052】052考试题库一变再变,完整题库收集整理-第15题
15.Which two are true about space management in tablespaces? A) Locally managed tablespaces have eit ...
- spdlog日志库的封装使用
文章目录 前言 spdlog的基本使用 spdlog日志库的封装 前言 编码过程中,日志是必要的一个组件,我们选择使用哪个日志库呢? 参考:15 best C++ Logging libraries ...
- 服务器开发27:log4c充当服务器跨平台日志库(cmake跨平台编译,配置介绍及代码封装)
文章目录 一.跨平台编译 1)编译准备 (1)expat编译 2)原生linux编译.安装 3)cmake跨平台编译 二.log4c配置笔记 1)与log4cpp\log4cxx的比较 2)log4c ...
- go zap日志库的使用,以及封装。
go zap日志库使用说明 及 封装 1 zap日志的基本使用 1.0 zap简介 1.1 日志介绍 1.2 为什么选择zap日志 1.3 zap的安装 1.4 创建实例-两种类型 1.4.1 Log ...
- 日志库EasyLogging++学习系列(3)—— 配置功能
在前面的文章 <日志库Easylogging++学习系列(1) -- 简要介绍 >中,我们已经初步见识到了 Easylogging++ 日志库强大的配置功能.那么配置文件中各个字段的意义是 ...
- go日志库log/zap/logrus
一个好的日志记录器能够提供下面这些功能: 能够将事件记录到文件中,而不是应用程序控制台. 日志切割-能够根据文件大小.时间或间隔等来切割日志文件. 支持不同的日志级别.例如INFO,DEBUG,ERR ...
- 【C/C++开源库】单片机/嵌入式中的C语言日志库
日志系统在系统开发和调整过程中的重要性,大家应该都清楚,特别是项目出问题之后,却没有日志可以帮忙定位问题,就非常令人痛苦. 因为我们不可能一直通过调试器去单步调试程序,所以设备的运行日志显得尤为重要. ...
- 【CC++开源库】单片机嵌入式中的C语言日志库
日志系统在系统开发和调整过程中的重要性,大家应该都清楚,特别是项目出问题之后,却没有日志可以帮忙定位问题,就非常令人痛苦. 因为我们不可能一直通过调试器去单步调试程序,所以设备的运行日志显得尤为重要. ...
最新文章
- Codeforces 815 B Karen and Test 杨辉三角 组合数学
- PostgreSQL创建数据库时报错:ERROR: source database template1 is being accessed by other users
- Android LiveData组件详解以及LiveDataBus
- PHP获取当前页面URL
- java类名与文件名_为什么Java文件名必须与公共类名相同?
- ssh 免密_Linux下配置SSH免密通信 “sshkeygen”的基本用法
- PKI与证书服务应用
- 【word使用技巧】删掉某一行参考
- vue中使用axios发送请求(二)
- Android源码下载编译(高通)
- python十六进制转为二进制_Python进制转换(二进制、十进制和十六进制)
- 考察数据结构——第三部分:二叉树和BSTs[译]
- 成都盛铭轩:商家怎么装修设计
- CSS(七)元素过渡、变化、动画
- 选修课程期末作业 : 大象基金交易信息系统分析与设计报告
- oracle-29913,Oracle RAC expdp 错误一例 ORA-29913: error in executing ODCIEXTTABLEPOPULATE callout...
- native-JavaScript通信流程( 基于最新的 react native版本 )
- 如何做一个真正的男人
- python自己的手稿四之互动沟通
- Java虚拟机这一块 —— 深入理解java虚拟机(jvm)
热门文章
- 博德之门2增强版存档_博德之门2:增强版 存档位置及修改方法
- ucl计算机教授汪军,AI特辑#2:对话UCL汪军教授,机器有意识吗
- 机器学习流程错误分析
- Oracle APEX 系列文章8:如何从 APEX 5.1.4 升级到最新的 APEX 18.1
- window中文输入英文符号
- 【codeforces】【Round#523D】TV shows
- 利用云函数搭建简易的代理池
- 如何通过流失预测模型实现App用户增长?
- cron每半个小时执行一次_如何用crontab设定程序每半个小时执行一次
- runtime(零) Objc 中类和对象的本质