log4cplus 自定义 配置文件 格式
参考
Log4Cplus 学习笔记 - 配置文件的使用
https://blog.csdn.net/kakiebu/article/details/105501833
log4cplus 使用方法 配置
https://blog.csdn.net/lx_shudong/article/details/48732999
log4cPLus的搭建使用
https://blog.csdn.net/LyRics1996/article/details/119848198
log4cplus的相关说明使用以及示例
https://blog.csdn.net/leacock1991/article/details/109209959
Linux log工具:编译安装log4cplus及使用示例
https://blog.csdn.net/weixin_44498318/article/details/115544863
配置文件中的格式如下:
(1)"%%",转义为% 。
(2)"%c",输出logger名称,如test.subtest 。也可以控制logger名称的显示层次,比如"%c{1}"时输出"test",其中数字表示层次。
(3)"%D",显示本地时间,比如:"2004-10-16 18:55:45",%d显示标准时间。 可以通过%d{...}定义更详细的显示格式,比如%d{%H:%M:%s}表示要显示小时:分钟:秒。大括号中可显示的
预定义标识符如下:
%a -- 表示礼拜几,英文缩写形式,比如"Fri"
%A -- 表示礼拜几,比如"Friday"
%b -- 表示几月份,英文缩写形式,比如"Oct"
%B -- 表示几月份,"October"
%c -- 标准的日期+时间格式,如 "Sat Oct 16 18:56:19 2004"
%d -- 表示今天是这个月的几号(1-31)"16"
%H -- 表示当前时刻是几时(0-23),如 "18"
%I -- 表示当前时刻是几时(1-12),如 "6"
%j -- 表示今天是哪一天(1-366),如 "290"
%m -- 表示本月是哪一月(1-12),如 "10"
%M -- 表示当前时刻是哪一分钟(0-59),如 "59"
%p -- 表示现在是上午还是下午, AM or PM
%q -- 表示当前时刻中毫秒部分(0-999),如 "237"
%Q -- 表示当前时刻中带小数的毫秒部分(0-999.999),如 "430.732"
%S -- 表示当前时刻的多少秒(0-59),如 "32"
%U -- 表示本周是今年的第几个礼拜,以周日为第一天开始计算(0-53),如 "41"
%w -- 表示礼拜几,(0-6, 礼拜天为0),如 "6"
%W -- 表示本周是今年的第几个礼拜,以周一为第一天开始计算(0-53),如 "41"
%x -- 标准的日期格式,如 "10/16/04"
% X -- 标准的时间格式,如 "19:02:34"
%y -- 两位数的年份(0-99),如 "04"
%Y -- 四位数的年份,如 "2004"
%Z -- 时区名,比如 "GMT"
(4)"%F",输出当前记录器所在的文件名称,比如"main.cpp"
(5)"%L",输出当前记录器所在的文件行号,比如"51"
(6)"%l",输出当前记录器所在的文件名称和行号,比如"main.cpp:51"
(7)"%m",输出原始信息。
(8)"%n",换行符。
(9)"%p",输出LogLevel,比如"DEBUG"
(10)"%t",输出记录器所在的线程ID,比如 "1075298944"
(11)"%x",嵌套诊断上下文NDC (nested diagnostic context) 输出,从堆栈中弹出上下文信息,NDC可以用对不同源的log信息(同时地)交叉输出进行区分。
(12)格式对齐,比如"%-10m"时表示左对齐,宽度是10,当然其它的控制字符也可以相同的方式来使用,比如"%-12d","%-5p"等等。
将日志输出到控制台并写入文件:
例2:将日志输出到控制台并写入文件
#include "pch.h"
#include <iostream>
#include <log4cplus/logger.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/layout.h>
#include <log4cplus/ndc.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/helpers/property.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/initializer.h>
#include <log4cplus/log4cplus.h>
using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;
#pragma comment(lib,"log4cplusSUD.lib")
const int LOOP_COUNT = 20000;
int main()
{
//第1步:用Initializer类进行初始化
log4cplus::Initializer initializer;
//第2步:创建ConsoleAppender;
//SharedAppenderPtr 指向一个Appender的指针,这里new 了一个 ConsoleAppender
log4cplus::SharedAppenderPtr consoleAppender(new log4cplus::ConsoleAppender());
// std::ios_base::app 每次进行写入操作的时候都会重新定位到文件的末尾.
log4cplus::SharedAppenderPtr fileAppender(new log4cplus::FileAppender(LOG4CPLUS_TEXT("./logs/log.txt"), std::ios_base::app, true, true));
//第3步:设置consoleAppender的名称和输出格式(SimpleLayout) fileAppender的名称和pattern格式(PatternLayout)
// unique_ptr 智能指针
consoleAppender->setName(LOG4CPLUS_TEXT("console"));
consoleAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout));
fileAppender->setName(LOG4CPLUS_TEXT("file"));
// 参见 https://log4cplus.sourceforge.io/docs/html/classlog4cplus_1_1PatternLayout.html
//2020/10/16 16:13:03,481.502 [140068134246208] INFO test - Hello world [/home/leacock/CLionProjects/Log4CplusDemo/OutputLogToFileAndConsle/main.cpp:33]
// %D{%Y/%m/%d %H:%M:%S,%Q} 2020/10/16 16:13:03,481.502 时间 %D 表本地时间, 年/月/日/ 时:分:秒:毫秒
//[%t] [140068134246208] 输出生成日志事件的线程的线程id
//%-5p INFO 输出日志事件的日志级别 %-5 如果名称小于5个字符长,则右侧加空格。
//%c test 用于输出记录日志的是哪个logger,这里 在getInstance(LOG4CPLUS_TEXT ("test"))设置了名称
//%m Hello world 输出与logger关联的应用程序提供消息。
//%l 等同于 "%F:%L" F:用于输出日志请求发出时的文件名 L:用于输出从何处发出日志请求的行号。
//%n 输出换行
log4cplus::tstring pattern = LOG4CPLUS_TEXT("%D{%Y/%m/%d %H:%M:%S,%Q} [%t] %-5p %c - %m [%l]%n");
fileAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::PatternLayout(pattern)));
//第4步:获得一个Logger实例,并设置其日志输出等级阈值
log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("test"));
logger.setLogLevel(log4cplus::INFO_LOG_LEVEL);
//第5步:为Logger实例添加ConsoleAppender 与 FileAppender
logger.addAppender(consoleAppender);
logger.addAppender(fileAppender);
//第6步:使用宏将日志输出
LOG4CPLUS_INFO(logger, LOG4CPLUS_TEXT("Hello world"));
return 0;
}
输出到控制台,同时输出到回滚文件
#include "pch.h"
#include <iostream>
#include <log4cplus/logger.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/layout.h>
#include <log4cplus/ndc.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/helpers/property.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/initializer.h>
#include <log4cplus/log4cplus.h>
using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;
#pragma comment(lib,"log4cplusSUD.lib")
const int LOOP_COUNT = 20000;
int main()
{
// 1 初始化
log4cplus::Initializer initializer;
// 2 创建 appender
log4cplus::SharedAppenderPtr rollingFileAppender(new log4cplus::RollingFileAppender(LOG4CPLUS_TEXT("./logs/roll_log/roll_file_log"), 200 * 1024, 5, true, true));
// // 3 设置consoleAppender的名称和输出格式,这里使用缺省的 TTCCLayout 格式
// rollingFileAppender->setName(LOG4CPLUS_TEXT("roll file test"));
// rollingFileAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::TTCCLayout()));
rollingFileAppender->setName(LOG4CPLUS_TEXT("roll file test"));
log4cplus::tstring pattern = LOG4CPLUS_TEXT("%D{%Y/%m/%d %H:%M:%S,%Q} [%t] %-5p %c - %m [%l]%n");
rollingFileAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::PatternLayout(pattern)));
// 4 获得一个Logger实例,并设置其日志输出等级阈值
log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("roll_file"));
logger.setLogLevel(log4cplus::TRACE_LOG_LEVEL);
// 5 为Logger实例添加RollingFileAppender
logger.addAppender(rollingFileAppender);
//第2步:创建ConsoleAppender;
//SharedAppenderPtr 指向一个Appender的指针,这里new 了一个 ConsoleAppender
log4cplus::SharedAppenderPtr consoleAppender(new log4cplus::ConsoleAppender());
//第3步:设置consoleAppender的名称和输出格式(SimpleLayout) fileAppender的名称和pattern格式(PatternLayout)
// unique_ptr 智能指针
consoleAppender->setName(LOG4CPLUS_TEXT("console"));
consoleAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout));
logger.addAppender(consoleAppender);
for (int i = 0; i < 5000; i++) {
LOG4CPLUS_DEBUG(logger, "Entering loop #" << i);
}
return 0;
}
2.6 重定向到文件
三种FileAppender构造函数:
/* 1、一般文件输出 */
FileAppender(const log4cplus::tstring& filename, /* 文件名 */
std::ios_base::openmode mode = std::ios_base::trunc, /* 文件类型,默认trunc将先前文件删除 */
bool immediateFlush = true, /* 是否每次写一条记录都刷新一次缓存,一般为true */
bool createDirs = false); /* 是否创建目录 */
/* 2、按日志文件大小输出 */
RollingFileAppender(const log4cplus::tstring& filename,
long maxFileSize = 10*1024*1024, /* 文件最大尺寸,默认10MB */
int maxBackupIndex = 1, /* 最大记录文件数 */
bool immediateFlush = true,
bool createDirs = false);
/* 3、按时间周期输出 */
DailyRollingFileAppender(const log4cplus::tstring& filename,
DailyRollingFileSchedule schedule = DAILY,
/* 存储频度:MONTHLY/WEEKLY/DAILY/TWICE_DAILY/HOURLY/MINUTELY */
bool immediateFlush = true,
int maxBackupIndex = 10,
bool createDirs = false,
bool rollOnClose = true,
const log4cplus::tstring& datePattern = log4cplus::tstring());
DailyRollingFileAppender 和控制台
#include "pch.h"
#include <iostream>
#include <windows.h>
#include <log4cplus/logger.h>
#include <log4cplus/fileappender.h>
#include <log4cplus/layout.h>
#include <log4cplus/ndc.h>
#include <log4cplus/helpers/loglog.h>
#include <log4cplus/helpers/property.h>
#include <log4cplus/loggingmacros.h>
#include <log4cplus/initializer.h>
#include <log4cplus/log4cplus.h>
using namespace std;
using namespace log4cplus;
using namespace log4cplus::helpers;
#pragma comment(lib,"log4cplusSUD.lib")
const int LOOP_COUNT = 20000;
int main()
{
// 1 初始化
log4cplus::Initializer initializer;
// 2 创建 appender
SharedAppenderPtr _append(new DailyRollingFileAppender(LOG4CPLUS_TEXT(" Test.log "), MINUTELY, true, 5));
_append->setName(LOG4CPLUS_TEXT(" file test "));
// 4 获得一个Logger实例,并设置其日志输出等级阈值
log4cplus::Logger logger = log4cplus::Logger::getInstance(LOG4CPLUS_TEXT("roll_file"));
logger.setLogLevel(log4cplus::TRACE_LOG_LEVEL);
// 5 为Logger实例添加RollingFileAppender
logger.addAppender(_append);
//第2步:创建ConsoleAppender;
//SharedAppenderPtr 指向一个Appender的指针,这里new 了一个 ConsoleAppender
log4cplus::SharedAppenderPtr consoleAppender(new log4cplus::ConsoleAppender());
//第3步:设置consoleAppender的名称和输出格式(SimpleLayout) fileAppender的名称和pattern格式(PatternLayout)
// unique_ptr 智能指针
consoleAppender->setName(LOG4CPLUS_TEXT("console"));
consoleAppender->setLayout(std::unique_ptr<log4cplus::Layout>(new log4cplus::SimpleLayout));
logger.addAppender(consoleAppender);
for (int i = 0; i < 5000; i++) {
LOG4CPLUS_DEBUG(logger, "Entering loop #" << i);
Sleep(100);
}
return 0;
}