1.SysConfig配置
{HOME}/bin/sysConfig.bat
引入配置文件
{HOME}/ierp/bin/logger-config.properties
读取配置并对日志模块进行增删改
各配置项说明
- 模块:用于标识日志模块的名称,可根据需要自行增加
- 包前缀:暂未使用
- 级别:控制日志输出级别(下列级别由低到高),可根据实际情况选择级别以便控制日志输出。
- ALL
- DEBUG
- INFO
- WARN
- ERROR
- NSTAC
- OFF
- 输出:设置日志输出文件的位置(一般设置在Home的nclog文件夹下)
- 格式: 控制日志输出的格式
- %p: 日志级别
- %X{serial}:访问ID
- %t: 线程标识
- %X{remoteAddr}: 访问地址
- %X{user}: 访问人
- %d{yyyy-MM-dd HH:mm:ss}: 日志输出时间
- %m: 日志输出信息
- %n: 换行
- 滚动策略: 控制日志文件的拆分规则,何种条件下生成新文件,备份或删除旧文件
- 时间策略
- 每年:按年生成文件
- 每月:按月生成文件
- 每天:按天生成文件
- 每小时:按小时生成文件
- 每分钟:按分钟生成文件
- 大小策略
- 最大字节:设置单个文件大小(KB/MB/GB)
- 最大文件数:设置保存的最大文件数量,超过后删除最早文件
- 其他策略(单个文件)
- 时间策略
2.使用
NC中的Logger调用的都是静态方法,如果在多个模块中打印日志,会出现日志内容出现在不同输出文件的情况,比较混乱,不建议直接使用,可再次封装为日志工具,增加其他功能。(下方示例代码使用StopWatch增加耗时统计功能)
package com.yonyou.yh.nhis.common.util;
import nc.bs.logging.Logger;
import org.apache.commons.lang3.time.StopWatch;
/**
* 日志工具类封装(记录耗时)
* 由于在不同类内使用会导致时间不统一,由静态调用改为实例调用
* @author walton
* @date 2020-06-23
*/
public class HplusLogUtils {
/** 初始化模块名 */
private String initName;
/** 日志等级 */
private Integer level;
/** 时间记录器 */
private StopWatch sw;
public static final int DEBUG = 0, INFO = 1, WARN = 2 ,ERROR = 3;
/**
* 获取实例
* @return
*/
public static HplusLogUtils getInstance(){
return new HplusLogUtils();
}
/**
* 私有构造器
*/
private HplusLogUtils() {
super();
setSw(new StopWatch());
}
/**
* 打印日志前必须调用此方法(使用StopWatch记录执行时间)
* @param moduleName 在日志配置文件({home}\ierp\bin\logger-config.properties)/(sysConfig.bat)中已配置的module
* @param msg 需要打印的日志消息
* @param level 日志级别([DEBUG = 0, INFO = 1, WARN = 2 ,ERROR = 3]默认为0)
*/
public void start(String moduleName,String msg,Integer level){
String originModule = Logger.getModule();
if(moduleName != null){
setInitName(moduleName);
}
Logger.init(getInitName());
setLevel(level==null?0:level);
getSw().start();
doPrintWithLevel(getLevel(),msg,getSw().getTime());
Logger.init(originModule);
}
/**
* 调用start方法后,使用此方法进行分割记录,(执行时间为从start开始到split的时间)
* @param msg
*/
public void split(String msg){
String originModule = Logger.getModule();
Logger.init(getInitName());
getSw().split();
doPrintWithLevel(getLevel(),msg,getSw().getSplitTime());
Logger.init(originModule);
}
/**
* 记录方法结束时必须调用此方法结束记录(执行时间为start到stop的时间)
* @param msg
*/
public void stop(String msg){
String originModule = Logger.getModule();
Logger.init(getInitName());
doPrintWithLevel(getLevel(),msg,getSw().getTime());
getSw().stop();
Logger.init(originModule);
}
/**
* 根据level选择输出日志级别(内部调用,如果需要其他输出级别,可在此处扩展)
* @param level
* @param msg
* @param time
*/
private void doPrintWithLevel(Integer level,String msg,Long time){
String printMsg = String.format("------ %s 已耗时: %s ms ------", msg,time);
switch(level){
case 0:
Logger.debug(printMsg);
break;
case 1:
Logger.info(printMsg);
break;
case 2:
Logger.warn(printMsg);
break;
case 3:
Logger.error(printMsg);
break;
default:
Logger.debug(printMsg);
break;
}
}
/**
* @return initName 初始化模块名
*/
public String getInitName() {
return initName;
}
/**
* @return level 日志等级
*/
public Integer getLevel() {
return level;
}
/**
* @return sw 时间记录器
*/
public StopWatch getSw() {
return sw;
}
/**
* @param initName 要设置的 初始化模块名
*/
public void setInitName(String initName) {
this.initName = initName;
}
/**
* @param level 要设置的 日志等级
*/
public void setLevel(Integer level) {
this.level = level;
}
/**
* @param sw 要设置的 时间记录器
*/
public void setSw(StopWatch sw) {
this.sw = sw;
}
}
使用日志工具示例
HplusLogUtils logUtil = HplusLogUtils.getInstance();
logUtil.start("nhbd", "日志开始", HplusLogUtils.DEBUG);
logUtil.split("接口方法执行前");
//......调用的其他方法
logUtil.split("接口方法执行后");
logUtil.stop("日志结束");