NC日志配置及使用方法

1.SysConfig配置

{HOME}/bin/sysConfig.bat

引入配置文件

{HOME}/ierp/bin/logger-config.properties

读取配置并对日志模块进行增删改

各配置项说明

  1. 模块:用于标识日志模块的名称,可根据需要自行增加
  2. 包前缀:暂未使用
  3. 级别:控制日志输出级别(下列级别由低到高),可根据实际情况选择级别以便控制日志输出。
    • ALL
    • DEBUG
    • INFO
    • WARN
    • ERROR
    • NSTAC
    • OFF
  4. 输出:设置日志输出文件的位置(一般设置在Home的nclog文件夹下)
  5. 格式: 控制日志输出的格式
    • %p: 日志级别
    • %X{serial}:访问ID
    • %t: 线程标识
    • %X{remoteAddr}: 访问地址
    • %X{user}: 访问人
    • %d{yyyy-MM-dd HH:mm:ss}: 日志输出时间
    • %m: 日志输出信息
    • %n: 换行
  6. 滚动策略: 控制日志文件的拆分规则,何种条件下生成新文件,备份或删除旧文件
    • 时间策略
      • 每年:按年生成文件
      • 每月:按月生成文件
      • 每天:按天生成文件
      • 每小时:按小时生成文件
      • 每分钟:按分钟生成文件
    • 大小策略
      • 最大字节:设置单个文件大小(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("日志结束");
posted @ 2022-03-23 19:17  奇风顿行  阅读(1799)  评论(1编辑  收藏  举报