工具类:
import java.util.Objects;
import org.apache.log4j.ConsoleAppender;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.log4j.PatternLayout;
import org.apache.log4j.RollingFileAppender;
/**
* log4j日志工具类
* @author zql
* @createTime 2020-12-13 22:49:28
* @version 1.0
*
*/
public class LogUtil {
/**
* 默认日志级别
*/
private static Level LEVEL = Level.INFO;
/**
* 默认日志最低输出级别
*/
private static Level PRIORITY = Level.INFO;
/**
* 默认日志输出编码UTF-8
*/
private static String ENCODING = "utf-8";
/**
* 默认日志文件名
*/
private static String LOG_FILE_NAME = "info";
/**
* 用于获取一个以当前线程名命名的logger
* @author zql
* @createTime 2020-12-13 22:51:11
*
* @return
*/
public static Logger getLogger() {
String code = LogUtil.LOG_FILE_NAME;
// 判断logger是否已经存在,logger存在且该logger已配置code命名appender则直接返回
if (Objects.nonNull(LogManager.exists(code))) {
Logger logger = LogManager.getLogger(code);
if (Objects.nonNull(logger)) {
return logger;
}
}
// 生成logger
Logger logger = LogManager.getLogger(code);
// 不继承父类的Additivity
logger.setAdditivity(true);
// 设置日志级别
logger.setLevel(LogUtil.LEVEL);
// 生成新的Additivity
RollingFileAppender appender = new RollingFileAppender();
// 重命名appender
appender.setName(code);
// log的输出形式
PatternLayout layout = new PatternLayout();
String cp = "[ %p ] [%d{yyyy-MM-dd HH:mm:ss,SSS} %l ]:%m%n";
layout.setConversionPattern(cp);
appender.setLayout(layout);
// 日志输出路径,实际通过项目配置文件进行读取
String logOutPath = "E:\\logs";
appender.setFile(logOutPath + "\\" + code + ".log");
// log文件备份数量
appender.setMaxBackupIndex(10);
// log文件大小
appender.setMaxFileSize("30MB");
// log的文字码
appender.setEncoding(LogUtil.ENCODING);
// 设置日志信息的最低输出级别
appender.setThreshold(LogUtil.PRIORITY);
// true:在已存在log文件后面追加,false:新log覆盖以前的log
appender.setAppend(true);
// 适用当前的配置
appender.activateOptions();
// 默认不输出到控制台,实际通过项目配置文件进行读取
boolean isOutConsole = true;
ConsoleAppender console = null;
if (isOutConsole) {
console = new ConsoleAppender();
// 设置控制台最低输出级别
console.setThreshold(Level.DEBUG);
console.setLayout(layout);
console.setEncoding(LogUtil.ENCODING);
console.activateOptions();
}
// 将新的Appender设置到Logger中,利用同步代码块防止多线程环境下,同一个logger下加入两个同名appender,导致日志重复打印
synchronized(LogUtil.class) {
if (Objects.isNull(logger.getAppender(code))) {
logger.addAppender(appender);
}
if (isOutConsole) {
logger.addAppender(console);
}
}
return logger;
}
/**
* 重置日志文件名
* @author zql
* @createTime 2020-12-13 23:14:49
*
* @param code
*/
public static void resetLogFileName(String code) {
LogUtil.LOG_FILE_NAME = code;
}
/**
* 重置日志打印级别
* @author zql
* @createTime 2020-12-13 23:17:01
*
* @param level
*/
public static void setLevel(Level level) {
LogUtil.LEVEL = level;
}
/**
* 重置日志最低输出级别
* @author zql
* @createTime 2020-12-13 23:19:16
*
* @param priority
*/
public static void setPriority(Level priority) {
LogUtil.PRIORITY = priority;
}
}
测试类:
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import top.zqlweb.util.tool.LogUtil;
/**
* log4j日志工具测试类
* @author zql
* @createTime 2020-12-13 22:49:28
* @version 1.0
*
*/
public class LogUtilTest {
public static void main(String[] args) {
Logger logger1 = LogUtil.getLogger();
logger1.info("测试info");
LogUtil.resetLogFileName("error");
Logger logger2 = LogUtil.getLogger();
logger2.error("测试error");
// 重置日志打印输出级别
LogUtil.setLevel(Level.DEBUG);
LogUtil.setPriority(Level.DEBUG);
// 把DEBUG日志级别的打印到debug.log日志文件下
LogUtil.resetLogFileName("debug");
LogUtil.getLogger().debug("测试debug");
}
}
普通项目需要引入的包
log4j-1.2.17.jar
maven项目依赖
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
Java无配置log4j日志引入方法
博客介绍了Java使用无配置log4j日志的相关内容,包含工具类、测试类,还说明了普通项目需引入log4j - 1.2.17.jar包,以及maven项目的依赖情况。
334

被折叠的 条评论
为什么被折叠?



