## 日志四种级别

- debug (最低)
- info
- warn
- error (最高)

开启某个级别的日志，则当前及比它更高的级别的日志将被输出。

如，设置日志级别为warn，则将输出warn和error日志。



## 用法

```java
// 1.引入类
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;

// 2.创建logger
private final static Log logger = LogFactory.getLog("name");
// 或
private final static Log logger = LogFactory.getLog(XXX.class);

// 3.使用
if (logger.isDebugEnabled()) {
	logger.debug("Debug info...");
}
```

注意，输出日志一定要先判断`logger.isXXXEnabled()`，以减少开销。

只需要判断当前记录日志的级别释放开启，如使用`logger.debug`，只需要判断`isDebugEnabled`。



## Log 接口

`kd.bos.logging.Log`：

```java
/**
 * 判断级别日志是否开启
 */
public boolean isDebugEnabled();
public boolean isInfoEnabled();
public boolean isWarnEnabled();
public boolean isErrorEnabled();

/**
 * 输出调试信息
 */
public void debug(String msg);

/**
 * 输出应用信息
 */
public void info(String msg);


/**
 * 输出警告信息
 */
public void warn(String msg);
public void warn(Throwable e);
public void warn(String msg, Throwable e);

/**
 * 输出错误信息
 */
public void error(String msg);
public void error(Throwable e);
public void error(String msg, Throwable e);
````



## 集群环境日志配置

通过配置中心设置，配置key为:  `log.config`，内容形如：

```xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--30 seconds  scan="true" scanPeriod="1 minutes" -->
<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>bos-dev-log</topic>
        <brokerList>172.17.51.98:9092</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="file" />
        <appender-ref ref="kafka" />
 -->        
        <appender-ref ref="stdot" />


    </root>

</configuration>
```



## 开发机环境自日志配置

开发机日志配置，默认使用所在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`

### 过滤输出内容


修改工程`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;
}
```

