JUL日志系统
项目中有大量控制台输出语句,实际运行不打印日志,直接输出很难实现,需要日志框架规范化日志输出
JDK自带日志框架
示例
public static void main(String[] args) {
Logger logger = Logger.getLogger(Main.class.getName());
logger.info("hello,world");
}
日志优先级
- SEVERE 严重错误
- WARNING 某些警告
- INFO 常规消息
- CONFIG
- FINE
- FINER
- FINST 最低值
设置日志级别
logger.setLevel(Level.CONFIG);
不使用父日志处理器
logger.setUseParentHandlers(false);
使用日志处理器
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.CONFIG);
logger.addHandler(consoleHandler);
父日志打印器
System.out.println(logger.getParent().getClass());
文件处理器
//添加输出到本地文件
FileHandler fileHandler = new FileHandler("test.log");
fileHandler.setLevel(Level.WARNING);
logger.addHandler(fileHandler);
自定义打印格式
//使用自定义日志处理器(控制台)
ConsoleHandler handler = new ConsoleHandler();
handler.setLevel(Level.CONFIG);
handler.setFormatter(new XMLFormatter());
logger.addHandler(handler);
自行实现打印
public static void main(String[] args) throws IOException {
Logger logger = Logger.getLogger(Main.class.getName());
logger.setUseParentHandlers(false);
//为了让颜色变回普通的颜色,通过代码块在初始化时将输出流设定为System.out
ConsoleHandler handler = new ConsoleHandler(){{
setOutputStream(System.out);
}};
//创建匿名内部类实现自定义的格式
handler.setFormatter(new Formatter() {
@Override
public String format(LogRecord record) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
String time = format.format(new Date(record.getMillis())); //格式化日志时间
String level = record.getLevel().getName(); // 获取日志级别名称
// String level = record.getLevel().getLocalizedName(); // 获取本地化名称(语言跟随系统)
String thread = String.format("%10s", Thread.currentThread().getName()); //线程名称(做了格式化处理,留出10格空间)
long threadID = record.getThreadID(); //线程ID
String className = String.format("%-20s", record.getSourceClassName()); //发送日志的类名
String msg = record.getMessage(); //日志消息
//\033[33m作为颜色代码,30~37都有对应的颜色,38是没有颜色,IDEA能显示,但是某些地方可能不支持
return "\033[38m" + time + " \033[33m" + level + " \033[35m" + threadID
+ "\033[38m --- [" + thread + "] \033[36m" + className + "\033[38m : " + msg + "\n";
}
});
logger.addHandler(handler);
logger.info("我是测试消息1...");
logger.log(Level.INFO, "我是测试消息2...");
logger.log(Level.WARNING, "我是测试消息3...");
}
过滤某些日志
public static void main(String[] args) throws IOException {
Logger logger = Logger.getLogger(Main.class.getName());
//自定义过滤规则
logger.setFilter(record -> !record.getMessage().contains("普通"));
logger.log(Level.SEVERE, "严重的错误", new IOException("我就是错误"));
logger.log(Level.WARNING, "警告的内容");
logger.log(Level.INFO, "普通的信息");
}
Properties
java的一种配置文件
name = Test
desc = Description
格式:配置项=配置值
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
properties.load(new FileInputStream("test.properties"));
System.out.println(properties);
}
Properties本质上是一种Map结构,把所有的配置项映射成Map,快速读取对应配置的值
将Properties放到输出流保存,打印到控制台
public static void main(String[] args) throws IOException {
Properties properties = new Properties();
// properties.setProperty("test", "lbwnb"); //和put效果一样
properties.put("test", "lbwnb");
properties.store(System.out, "????");
//properties.storeToXML(System.out, "????"); 保存为XML格式
}
获取系统参数
public static void main(String[] args) throws IOException {
System.getProperties().store(System.out, "系统信息:");
}
日志配置文件
# RootLogger 的默认处理器为
handlers= java.util.logging.ConsoleHandler
# RootLogger 的默认的日志级别
.level= CONFIG
public static void main(String[] args) throws IOException {
//获取日志管理器
LogManager manager = LogManager.getLogManager();
//读取我们自己的配置文件
manager.readConfiguration(new FileInputStream("logging.properties"));
//再获取日志打印器
Logger logger = Logger.getLogger(Main.class.getName());
logger.log(Level.CONFIG, "我是一条日志信息"); //通过自定义配置文件,我们发现默认级别不再是INFO了
}
Lombok 日志
@Log(topic = "hello,world")
public class Main{
public static void main(String[] args) throws Exception{
System.out.println(log.getName());
}
}
Mybatis日志系统
开启日志
<setting name="logImpl" value="STDOUT_LOGGING" />
logImpl后可以填很多项:
SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING
示例
@Log(topic = "hello,world")
public class Main{
private SqlSessionFactory sqlSessionFactory;
@Before
public void before(){
try{
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(new FileInputStream("mybatis-config.xml"));
}catch (FileNotFoundException e){
e.printStackTrace();
}
}
@Test
public void test(){
try (SqlSession sqlSession = sqlSessionFactory.openSession(true)){
TestMapper mapper = sqlSession.getMapper(TestMapper.class);
mapper.selectStudent().forEach(System.out::println);
mapper.selectStudent().forEach(System.out::println);
}
}
}
查找两次只会打开一次数据库连接