1. 重点内容
- 日志模块介绍
- 全局系统运行日志
- 自定义一个日志输出
2. 运行展示
3. 程序示例
3.1 日志模块介绍
log是用于系统日志的输出,日志在开发、测试、维护阶段都很有用处,开发或利用一个合适强大的日志框架是很有必要的。
日志模块当前选用了两种第三方日志框架,分别是Qt内部的日志与log4qt日志,peanutlib封装这两种日志框架,提供一个统一的输出接口,例如,输出一个debug日志:
if(PlBaseApplication::getGlobalLogger()->isDebug()) {
LOG_DEBUG(PlBaseApplication::getGlobalLogger(), QObject::tr("debug日志"));
}
日志输出统一接口有五种级别,下面是输出代码举例:
LOG_DEBUG(PlBaseApplication::getGlobalLogger(), QObject::tr("debug日志"));
LOG_INFO(PlBaseApplication::getGlobalLogger(), QObject::tr("info日志"));
LOG_WARN(PlBaseApplication::getGlobalLogger(), QObject::tr("warn日志"));
LOG_ERROR(PlBaseApplication::getGlobalLogger(), QObject::tr("error日志"));
LOG_FATAL(PlBaseApplication::getGlobalLogger(), QObject::tr("fatal日志"));
3.2 全局系统运行日志
3.2.1 日志配置参数
系统运行日志在peanutlib中是全局的对象,PlBaseApplication::getGlobalLogger()就可以得到它,您可以在项目中任何想输出日志的地方使用到它,它的配置项在peanut_setting.ini文件中,我们看看该文件是如何配置。
[Log]
#日志模块选用,目前支持两种日志,peanut::PlQtLogController与peanut::PlLog4qtController
LogClassName=peanut::PlQtLogController
#日志模块选用,QLog对应peanut::PlQtLogController,Log4qt对应peanut::PlLog4qtController
LogType=QLog
#Log4qt对应的配置文件存放目录
LogFilePathName=./config/log4qt.conf
#日志debug开关,true:打开;false:关闭
isDebug=true
#日志info开关,true:打开;false:关闭
isInfo=true
#日志warn开关,true:打开;false:关闭
isWarn=true
#日志error开关,true:打开;false:关闭
isError=true
#日志fatal开关,true:打开;false:关闭
isFatal=true
#输出日志时,是否发送信号, true:在控制台输出,接收端能收到;false:不能
isSendSingal=true
#是否按缺省日志输出格式输出,true:是;false:不按默认的格式输出
isConversionPattern=true
#是否启动日志输出界面,true:启动;false:不启动
isLogForm=true
- 如果您要关闭日志的debug功能(debug通常是在开发测试阶段打开,在运维阶段可以关闭),可设置isDebug=false。
- 如果您不希望启动日志输出界面,可以关闭,那么当您使用
PlLogForm *logForm = app->getGlobalLogForm();
logForm将是一个空对象。
- 如果您想关闭所有日志输出,可将isDebug,isInfo,isError,,isWarm,isFatal开关全部关闭。
3.2.2 选用日志框架
日志框架目前QLog对应peanut::PlQtLogController与Log4qt对应peanut::PlLog4qtController,属于二选一的方式,QLog是Qt内嵌的(头文件<QDebug>),如果您对日志输出的功能局限于展示查看,选用它足够了。Log4qt是第三方的日志框架,它出自于Java的log4j的C++ Qt版本,它的功能比较强大,您可以选用它做除了显示查看之外的其它事情,比如,日志输出文件,在项目中已放置了一个log4qt.conf的配置文件,相关配置说明可参考其它文档,下面是该文档的一个例子,您可以在此基础上修改它。
#log4j.rootLogger=DEBUG,CONSOLE,A1,im
#log4j.rootLogger=INFO,CONSOLE,A1,im
#log4j.rootLogger=OFF
#log4j.rootLogger=DEBUT,stdout
#log4j.rootLogger=INFO,stdout
#log4j.rootLogger=INFO,A1,A1-STDOUT
log4j.rootLogger=DEBUG,A1,A1-STDOUT
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
log4j.addivity.org.apache=true
###################
# Pattern to output the caller's line number.
###################
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
###################
# Pattern to output the caller's file name.
###################
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=system.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
###################
# Console Appender
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[peanut] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
#####################
# File Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file
log4j.appender.FILE.DatePattern='.'yyyyMMdd-HH
log4j.appender.FILE.Append=true
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[peanut] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis
########################
# Rolling File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[peanut] %d - %c -%-4r [%t] %-5p %c %x - %m%n
####################
# Socket Appender
####################
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n
########################
# Log Factor 5 Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000
########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@hollycrm.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@hollycrm.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[peanut] %d - %c -%-4r [%t] %-5p %c %x - %m%n
########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[peanut] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#A1
## 每天生产一个文件
log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=peanut.log
#log4j.appender.A1.DatePattern='.'yyyyMMdd-HH'.log'
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[peanut] - %m%n
#log4j.appender.A1.layout.ConversionPattern=[peanut] %d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p] - %m%n
#log4j.appender.A1.Threshold=DEBUG
#log4j.appender.A1.Append=true
#log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout
#log4j.appender.A1.layout.ConversionPattern=[peanut] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#A1-STDOUT
log4j.appender.A1-STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.A1-STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.A1-STDOUT.layout.ConversionPattern=[peanut] %d{yyyy-MM-dd HH\:mm\:ss,SSS} [%p] - %m%n
###################
# Appender
###################
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender
log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net
log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[peanut] %d - %c -%-4r [%t] %-5p %c %x - %m%n
3.3 自定义一个日志输出
自定义一个日志输出,我们在前面的“01u-00-bean-认识bean模块”,“01u-01-bean-自定义一个模块”中就有对日志模块的BeanConfig说明。
在此基础上,我们还可以根据需求,定义多个日志bean对象,请看下面的beanConfig的配置,定义logBean_1,logBean_2,logBean_3。
<beanConfig chooseBeanId="logBeanQtlog" className="peanut::PlLogBeanConfig" id="logBeanConfigSample" name="LogModule" type="Log">
<bean isDebug="true" className="peanut::PlQtLogController" isWarn="true" id="logBean_1" name="" isSendSingal="true" isLogForm="false" isError="true" isConversionPattern="true" isFatal="true" isInfo="true" type="QLog"/>
<bean className="peanut::PlLog4qtController" id="logBean_2" filePath="./config/log4qt.conf" name="" isSendSingal="true" isLogForm="false" isConversionPattern="true" type="Log4qt"/>
<bean isDebug="true" className="peanut::PlQtLogController" isWarn="true" id="logBean_3" name="" isSendSingal="true" isLogForm="false" isError="true" isConversionPattern="true" isFatal="true" isInfo="true" type="QLog"/>
</beanConfig>
4. 代码下载
代码下载链接:https://pan.baidu.com/s/10DHJG1g8t-7jb9wIr_OGLA?pwd=jm8z 提取码: jm8z
Peanutlib项目演示程序下载:peanut_pwdis: pwdis是QT应用系统开发框架(C++),采用分层模块化设计,底层peanutlib按模块封装方便易用的类库及API(xml,db,appconfig,log,grid,json,bean等十几个),应用层提供部门人员权限及报表等,还提供了开发中常用的组件使用。