日志
# 1 简介
苍穹平台提供了一套统一的日志处理接口,并使用LogbackFactory为默认的日志工厂类,调用Slf4JLogger组件来实现日志操作。同时还提供给使用者自定义的日志工厂,只需要自定义LogFactory即可。
**日志级别**
+ debug (最低)
+ info
+ warn
+ error (最高)
开启某个级别的日志,则当前及比它更高的级别的日志将被输出。例如:设置日志级别为warn,则将输出warn和error日志。
# 2 应用场景
任何需要记录日志的的场景。
# 3 接口说明
日志相关接口定义和实现存在于bos-log-1.0.jar中。对于使用者来说只需要调用kd.bos.logging.LogFactory获取Log对象,然后调用Log对象的接口方法即可。
## 3.1 接口列表
***LogFactory***
| 静态方法 | 说明 |
| - | - |
| getLog | 获取Log日志对象 |
***Log***
| 接口方法 | 说明 |
| - | - |
| isDebugEnabled | debug级别日志是否开启 |
| isInfoEnabled | info级别日志是否开启 |
| isWarnEnabled | warn级别日志是否开启 |
| isErrorEnabled | error级别日志是否开启 |
| debug | 输出调试信息 |
| info | 输出应用信息 |
| warn | 输出警告信息 |
| error | 输出错误信息 |
## 3.2 使用示例
```java
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
// 创建logger
private final static Log logger = LogFactory.getLog("name");
// 或
private final static Log logger = LogFactory.getLog(XXX.class);
// 使用
if (logger.isDebugEnabled()) {
logger.debug("Debug info...");
}
```
> 输出日志一定要先判断logger.isXXXEnabled(),以减少开销。只需要判断当前记录日志的级别释放开启,如使用logger.debug,只需要判断isDebugEnabled。
# 4 注意事项
## 4.1 集群环境日志配置
通过配置中心设置,配置key为: log.config,如下图:
```xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<property name="LOG_HOME" value="../logs"/>
<appender name="metric" class="kd.bos.metric.instruments.logback.MetricAppender">
</appender>
<appender name="stdot" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{HH:mm:ss} [%thread] %level %logger.%M\(%L\):%m%n</pattern>
</layout>
</appender>
<appender name="kafka" class="kd.bos.logging.console.slf4j.logback.KafkaAppender">
<topic>{{clusterName}}-log</topic>
<brokerList>{{log.kafka.ip_port}}</brokerList>
<compressionType>none</compressionType>
<syncSend>false</syncSend>
<keySerializerClass>org.apache.kafka.common.serialization.StringSerializer</keySerializerClass>
<valueSerializerClass>org.apache.kafka.common.serialization.StringSerializer</valueSerializerClass>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${LOG_HOME}/log.%d{yyyy-MM-dd}(%i).log</FileNamePattern>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<maxHistory>5</maxHistory>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>10MB</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<charset>utf-8</charset>
<pattern>%d{HH:mm:ss} [%thread] %level %logger.%M\(%L\):%m%n</pattern>
</encoder>
<append>false</append>
<prudent>false</prudent>
</appender>
<logger name="org.apache" additivity="false" level="ERROR">
<appender-ref ref="stdot" />
</logger>
<logger name="org.javaswift.joss.command.impl.core.AbstractCommand" additivity="false" level="OFF">
<appender-ref ref="stdot" />
</logger>
<logger name="kd.bos.dc.utils.AccountUtils" additivity="false" level="ERROR">
<appender-ref ref="kafka" />
</logger>
<root level="INFO">
<appender-ref ref="kafka" />
</root>
</configuration>
```
## 4.2 自定义配置
在开发环境中,默认使用所在cluster的日志配置,也可以自定义配置。
在启动类(BosDebugInOne)中添加以下代码:
```java
// 自定义日志
StringBuffer log = new StringBuffer();
Files.readAllLines(Paths.get(BosDebugInOne.class.getResource("/log.config.xml").toURI())).forEach(s -> log.append(s + "\n"));
System.setProperty("log.config", log.toString());
```
修改日志配置内容: src\main\resources\log.config.xml
## 4.3 过滤输出内容
修改工程debug-bos-mservice中的类方法MyLogger.ignore:
```java
/**
* 如果要输出当前日志内容,返回false。
*/
@Override
protected boolean ignore(String level, String threadName, String loggerName, String msg) {
if (!"DB".equals(loggerName)) {
// 忽略
return true;
}
// 只输出DB日志
return false;
}
```
## 4.4 自定义日志工厂
### 配置
请在MC中配置以下参数:
| 属性 | 值 | 说明 |
| - | - | - |
| logfactory.className | com.xxx.MyLogFactory | 配置你开发的日志工厂实现类 |
在开发环境也可直接在启动类中配置。
```java
//配置你开发的日志工厂实现类,如:com.xxx.MyLogFactory
System.setProperty("logfactory.className","com.xxx.MyLogFactory");
```
### 接口实现
实现LogFactory抽象类的_getLog()抽象方法即可:
```java
public abstract class kd.bos.logging.LogFactory{
protected abstract Log _getLog(String clazzName);
}
```
创建MyLogFactory实现类,继承kd.bos.logging.LogFactory抽象类实现_getLog(String className)的逻辑:
```java
//第1步:自定义日志工厂类(样例代码)
public class MyLogFactory extends LogFactory{
private static final ConcurrentMap<String, MyLoggerImpl> logMap = new ConcurrentHashMap<String, MyLoggerImpl>();
@Override
protected Log _getLog(String className) {
MyLoggerImpl log = logMap.get(className);
if(log==null) {
log = new MyLoggerImpl(className);
MyLoggerImpl oldLog = logMap.putIfAbsent(className, log);
if(oldLog!=null)
return oldLog;
}
return log;
}
}
//第2步:实现日志操作类,要求实现kd.bos.logging.Log接口
public class MyLoggerImpl implements Log {
//void debug(String msg);
//void info(String msg);
...
}
```
日志
# 1 简介苍穹平台提供了一套统一的日志处理接口,并使用LogbackFactory为默认的日志工厂类,调用Slf4JLogger组件来实现日志操作。同时还...
点击下载文档
本文2024-09-23 00:27:58发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-139638.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章