Log4j(一):Log4j将日志信息写入数据库
前言
为了监听一些数据的采集等功能,需要随时监听设备的状态,所以需要运行的时候将日志打入到数据库中。
正文
第一步:
首先是jar包,由于我使用的是springboot,所以,在springboot-starter中已经包含了log4j的jar,不需要再导包,如果不是的话,需要导入log4j的包和mysql-connect的包。
第二步:
接下来是创建log4j的配置文件:log4j.properties配置文件,内容如下(这里只有输入到数据库中的配置,如果同时需要输入到控制台或者文件,请自行配置)
# Define the root logger with appender file log4j.rootLogger = DEBUG, DB # Define the DB appender log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender # Set JDBC URL log4j.appender.DB.URL=jdbc:mysql://localhost:3306/test # Set Database Driver log4j.appender.DB.driver=com.mysql.jdbc.Driver # Set database user name and password log4j.appender.DB.user=root log4j.appender.DB.password=root # Set the SQL statement to be executed. log4j.appender.DB.sql=INSERT INTO LOG (CREATE_TIME,TYPE,SYSTEM,HOST,TOTAL_MEMORY,FREE_MEMORY,TOTAL_DISK,FREE_DISK,CPU_CANUSE,DB_CONNECT,LOCATION,LOG_LEVEL,MESSAGE) VALUES (NOW(),'%X{TYPE}','%X{SYSTEM}','%X{HOST}','%X{TOTAL_MEMORY}','%X{FREE_MEMORY}','%X{TOTAL_DISK}','%X{FREE_DISK}','%X{CPU_CANUSE}','%X{DB_CONNECT}','%l','%p','%m') # Define the layout for file appender log4j.appender.DB.layout=org.apache.log4j.PatternLayout
对于上面代码的解释:
第一:写入数据库中日志的时候,可以指定sql语句。比如上面的 insert语句。另外需要指定url,username和password,这样才能正常插入。
第二:插入的表结构可以自己设定,需要和自己的语句对应,否则会插入错误。
第三:我的表结构如下:
DROP TABLE IF EXISTS `log`; CREATE TABLE `log` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `CREATE_TIME` datetime DEFAULT NULL COMMENT '创建时间', `TYPE` varchar(255) NOT NULL COMMENT '类型:1表示系统信息,2表示日志内容信息', `SYSTEM` varchar(255) DEFAULT NULL COMMENT '系统类型-位数,当type=1时候启用', `HOST` varchar(255) DEFAULT NULL COMMENT 'ip,当type=1时候启用', `TOTAL_MEMORY` varchar(255) DEFAULT NULL COMMENT '总内存量,当type=1时候启用', `FREE_MEMORY` varchar(255) DEFAULT NULL COMMENT '空闲内存,当type=1时候启用', `TOTAL_DISK` varchar(255) DEFAULT NULL COMMENT '工作盘总容量,当type=1时候启用', `FREE_DISK` varchar(255) DEFAULT NULL COMMENT '工作盘剩余容量,当type=1时候启用', `CPU_CANUSE` varchar(255) DEFAULT NULL COMMENT 'CPU可用百分比,当type=1时候启用', `DB_CONNECT` varchar(255) DEFAULT NULL COMMENT '连接目标数据库结果,当type=1时候启用', `LOCATION` varchar(255) DEFAULT NULL, `LOG_LEVEL` varchar(255) DEFAULT NULL, `MESSAGE` varchar(255) DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
第四:插入sql的书写,在书写的时候,必须使用'%X{TYPE}' 来表示你需要插入的时候传入值。特别注意:这里是大些的X,小写的不会识别。
第五:最后一些符号的详情如下
最后是代码了:
import org.apache.log4j.Logger; import org.apache.log4j.MDC; import org.hyperic.sigar.*; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.math.BigDecimal; import java.net.InetAddress; import java.util.Properties; /** * @Auther: Administrator * @Date: 2018/8/20 09:37 * @Description: */ public class Config { private static Logger logger = Logger.getLogger(Config.class); public static void main(String[] args) throws IOException, SigarException, Exception { Properties props = System.getProperties(); InetAddress addr = InetAddress.getLocalHost(); MDC.put("TYPE","1"); MDC.put("HOST",addr.getHostAddress()); MDC.put("SYSTEM",props.getProperty("os.name") + "-" + props.getProperty("os.arch")); Sigar sigar = new Sigar(); Mem mem = sigar.getMem(); MDC.put("TOTAL_MEMORY",new BigDecimal(mem.getTotal() / 1024 /1024 / 1024d).setScale(2,BigDecimal.ROUND_HALF_UP) + "GB"); MDC.put("FREE_MEMORY",new BigDecimal(mem.getFree() / 1024 /1024 / 1024d).setScale(2,BigDecimal.ROUND_HALF_UP) + "GB"); CpuInfo[] infos= sigar.getCpuInfoList(); CpuPerc[] cpuList = sigar.getCpuPercList(); Double totalFree = 0.0d; for (int i = 0; i < infos.length; i++) {// 不管是单块CPU还是多CPU都适用 CpuPerc cpu = cpuList[i]; totalFree += cpu.getIdle(); } MDC.put("CPU_CANUSE",String.valueOf(totalFree/cpuList.length)); FileSystem[] fslist = sigar.getFileSystemList(); String totalDisk = null; String freeDisk = null; for (int i = 0; i < fslist.length; i++) { FileSystem fs = fslist[i]; if (fs.getDevName().contains("E")) { FileSystemUsage usage = sigar.getFileSystemUsage(fs.getDirName()); if (fs.getType() == 2) { // 文件系统总大小 MDC.put("TOTAL_DISK",new BigDecimal(usage.getTotal() / 1024d / 1024).setScale(2,BigDecimal.ROUND_HALF_UP) + "GB"); MDC.put("FREE_DISK",new BigDecimal(usage.getFree() / 1024d / 1024).setScale(2,BigDecimal.ROUND_HALF_UP) + "GB"); } } } MDC.put("DB_CONNECT",true); try{ int[] arr = {1,2,3}; for (int i = 0; i < arr.length + 1 ; i++) { System.out.println(arr[i]); } }catch (Exception e){ logger.error("出现了异常", e); logger.error("出现异常:" + getExceptionMsg(e)); } } private static String getExceptionMsg(Exception e){ StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw, true); e.printStackTrace(pw); pw.flush(); sw.flush(); return sw.toString(); } }
写在最后:需要特别特别注意的是:因为我们要插入数据,很多数据都是自己事先指定的数据,所以,我们得使用MDC来把这些数据放入,然后直接打日志就可以存入数据库中了。
还有:注意导包的时候一定要使用log4j的logger对象,否则可能无法完成日志的插入。
关于slf4j来完成,目前我使用一直无法写入数据库,晚点更新结果。
附录:完整版本的log4j.properties配置文件
log4j.rootLogger = DEBUG,D,I,E,A,DB log4jFileName = dailywork log4j.appender.A = org.apache.log4j.ConsoleAppender log4j.appender.A.Target = System.out log4j.appender.A.Threshold=debug log4j.appender.A.layout = org.apache.log4j.PatternLayout log4j.appender.A.layout.ConversionPattern = %d{yyyy-MM-dd HH\:mm\:ss,SSS}%6p [%F\:%L] - %m%n log4j.appender.I=org.apache.log4j.RollingFileAppender log4j.appender.I.File=${log4jFileName}_info.log log4j.appender.I.Threshold=INFO log4j.appender.I.MaxFileSize = 20MB log4j.appender.I.MaxBackupIndex = 5 log4j.appender.I.Append=true log4j.appender.I.layout=org.apache.log4j.PatternLayout log4j.appender.I.layout.ConversionPattern= %d{yyyy-MM-dd HH\:mm\:ss,SSS}%6p [%F\:%L] - %m%n log4j.appender.D=org.apache.log4j.RollingFileAppender log4j.appender.D.File=${log4jFileName}_debug.log log4j.appender.D.Threshold=DEBUG log4j.appender.D.MaxFileSize = 20MB log4j.appender.D.MaxBackupIndex = 5 log4j.appender.D.Append=true log4j.appender.D.layout=org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern= %d{yyyy-MM-dd HH\:mm\:ss,SSS}%6p [%F\:%L] - %m%n log4j.appender.W=org.apache.log4j.RollingFileAppender log4j.appender.W.File=${log4jFileName}_warn.log log4j.appender.W.Threshold=WARN log4j.appender.W.MaxFileSize = 20MB log4j.appender.W.MaxBackupIndex = 5 log4j.appender.W.Append=true log4j.appender.W.layout=org.apache.log4j.PatternLayout log4j.appender.W.layout.ConversionPattern= %d{yyyy-MM-dd HH\:mm\:ss,SSS}%6p [%F\:%L] - %m%n log4j.appender.E=org.apache.log4j.RollingFileAppender log4j.appender.E.File=${log4jFileName}_error.log log4j.appender.E.Threshold=ERROR log4j.appender.E.MaxFileSize = 20MB log4j.appender.E.MaxBackupIndex = 5 log4j.appender.E.Append=true log4j.appender.E.layout=org.apache.log4j.PatternLayout log4j.appender.E.layout.ConversionPattern= %d{yyyy-MM-dd HH\:mm\:ss,SSS}%6p [%F\:%L] - %m%n log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender log4j.appender.DB.URL=jdbc:mysql://localhost:3306/test log4j.appender.DB.driver=com.mysql.jdbc.Driver log4j.appender.DB.user=root log4j.appender.DB.password=root log4j.appender.DB.sql=INSERT INTO LOG (CREATE_TIME,TYPE,SYSTEM,HOST,TOTAL_MEMORY,FREE_MEMORY,TOTAL_DISK,FREE_DISK,CPU_CANUSE,DB_CONNECT,LOCATION,LOG_LEVEL,MESSAGE) VALUES (NOW(),'%X{TYPE}','%X{SYSTEM}','%X{HOST}','%X{TOTAL_MEMORY}','%X{FREE_MEMORY}','%X{TOTAL_DISK}','%X{FREE_DISK}','%X{CPU_CANUSE}','%X{DB_CONNECT}','%l','%p','%m') log4j.appender.DB.layout=org.apache.
posted on 2018-08-20 18:49 一个什么都不会的人 阅读(6576) 评论(0) 编辑 收藏 举报