// Path: xjob-util/xjob-util-log/log-api/src/main/java/org/shoper/log/core/config/Constans.java
// public class Constans {
//     //主版本号
//     public static final String MAJORVERSION = "1";
//     //默认的logtopic
//     public static final String LOGTOPIC = "sys-log";
//     //Property
//     public static final String PROPERTY = "property";
//     public static final String FNAME = "fname";
//     public static final String LINE = "line";
//     public static final String PERCENT = "%";
//     public static final String SPACE = " ";
//     public static final String EMPTY = "";
//     public static final String DASH = "-";
//     public static final String INFO = "INFO";
//     public static final String NEWLINE = "\r\n";
//     //结束行
//     public static final String OVER = "\001OVER\001";
//     public static final String WARN = "WARN";
//     public static final String DEBUG = "DEBUG";
//     public static final String ERROR = "ERROR";
//     //默认分隔符
//     public static final String PLACEHOLDER = "\001";
//     public static final String PLACEHOLDER2 = "\002";
//     public static final String TYPE_JSON = "JSON";
//     public static final String TYPE_XML = "XML";
//     public static final String TYPE_STRING = "STRING";
// }
// 
// Path: xjob-util/xjob-util-log/log-util/src/main/java/org/shoper/log/util/config/LogProperties.java
// public class LogProperties {
//     //输出终端
//     private Target[] targets;
//     //系统的host
//     private String host;
//     //系统的port
//     private int port;
//     //系统名
//     private String application;
//     //kafka配置
//     private KafkaProperties kafka;
//     //日志级别
//     private LogLevel logLevel = LogLevel.Debug;
//     //File配置
//     private FileProperties fileProperties;
//     //日志输出模板
//     private String partten;
// 
//     public LogLevel getLogLevel() {
//         return logLevel;
//     }
// 
//     public void setLogLevel(LogLevel logLevel) {
//         this.logLevel = logLevel;
//     }
// 
//     public KafkaProperties getKafka() {
//         return kafka;
//     }
// 
//     public void setKafka(KafkaProperties kafka) {
//         this.kafka = kafka;
//     }
// 
//     public FileProperties getFileProperties() {
//         return fileProperties;
//     }
// 
//     public String getPartten() {
//         return partten;
//     }
// 
//     public void setPartten(String partten) {
//         this.partten = partten;
//     }
// 
//     public void setFileProperties(FileProperties fileProperties) {
//         this.fileProperties = fileProperties;
//     }
// 
//     public Target[] getTargets() {
//         return targets;
//     }
// 
//     public void setTargets(Target[] targets) {
//         this.targets = targets;
//     }
// 
//     public String getHost() {
//         return host;
//     }
// 
//     public void setHost(String host) {
//         this.host = host;
//     }
// 
//     public int getPort() {
//         return port;
//     }
// 
//     public void setPort(int port) {
//         this.port = port;
//     }
// 
//     public String getApplication() {
//         return application;
//     }
// 
//     public void setApplication(String application) {
//         this.application = application;
//     }
// }
// 
// Path: xjob-util/xjob-util-log/log-util/src/main/java/org/shoper/log/util/constans/LogLevel.java
// public enum LogLevel {
//     Debug("DEBUG", 0), Info("INFO", 1), Warn("Warn", 2), Error("ERROR", 3), Fatal("FATAL", 4);
// 
//     LogLevel(String name, int value) {
//         this.name = name;
//         this.value = value;
//     }
// 
//     private String name;
//     private int value;
// 
//     private String getName() {
//         return name;
//     }
// 
//     private void setName(String name) {
//         this.name = name;
//     }
// 
//     private int getValue() {
//         return value;
//     }
// 
//     private void setValue(short value) {
//         this.value = value;
//     }
// 
//     /**
//      * 日志级别比较,0等于,-1小于,1大于
//      * @param logLevel
//      * @return
//      */
//     public int compare(LogLevel logLevel) {
//         if (this.value > logLevel.value) return 1;
//         else if (this == logLevel) return 0;
//         else return -1;
//     }
// }


import org.shoper.log.core.config.Constans;
import org.shoper.log.util.config.LogProperties;
import org.shoper.log.util.constans.LogLevel;
import javax.annotation.PreDestroy;
import java.util.Arrays;
import java.util.Objects;
            Object[] ts = null;
            if (obj[obj.length - 1] instanceof Throwable) {
                ts = Arrays.copyOf(obj, obj.length - 1, Object[].class);
                logInfo.setThrowable((Throwable) obj[obj.length - 1]);
            }
            logInfo.setMsg(String.format(formatter, Objects.nonNull(ts) ? ts : obj));
        } else {
            logInfo.setMsg(formatter);
        }

        return logInfo;
    }

    public void info(String formatter, Object... obj) {
        info(null, format(formatter, obj));
    }

//    public void info(String channel, String formatter, Object... obj) {
//        info(channel, format(formatter, obj));
//    }

    public void warn(LogInfo logMsg) {
        log(null, logMsg, Constans.WARN);
    }

    public void warn(String formatter, Object... obj) {
        warn(format(formatter, obj));
    }

    private void debug(LogInfo logMsg) {
// Path: xjob-util/xjob-util-log/log-api/src/main/java/org/shoper/log/core/config/Constans.java
// public class Constans {
//     //主版本号
//     public static final String MAJORVERSION = "1";
//     //默认的logtopic
//     public static final String LOGTOPIC = "sys-log";
//     //Property
//     public static final String PROPERTY = "property";
//     public static final String FNAME = "fname";
//     public static final String LINE = "line";
//     public static final String PERCENT = "%";
//     public static final String SPACE = " ";
//     public static final String EMPTY = "";
//     public static final String DASH = "-";
//     public static final String INFO = "INFO";
//     public static final String NEWLINE = "\r\n";
//     //结束行
//     public static final String OVER = "\001OVER\001";
//     public static final String WARN = "WARN";
//     public static final String DEBUG = "DEBUG";
//     public static final String ERROR = "ERROR";
//     //默认分隔符
//     public static final String PLACEHOLDER = "\001";
//     public static final String PLACEHOLDER2 = "\002";
//     public static final String TYPE_JSON = "JSON";
//     public static final String TYPE_XML = "XML";
//     public static final String TYPE_STRING = "STRING";
// }
// 
// Path: xjob-util/xjob-util-log/log-util/src/main/java/org/shoper/log/util/config/LogProperties.java
// public class LogProperties {
//     //输出终端
//     private Target[] targets;
//     //系统的host
//     private String host;
//     //系统的port
//     private int port;
//     //系统名
//     private String application;
//     //kafka配置
//     private KafkaProperties kafka;
//     //日志级别
//     private LogLevel logLevel = LogLevel.Debug;
//     //File配置
//     private FileProperties fileProperties;
//     //日志输出模板
//     private String partten;
// 
//     public LogLevel getLogLevel() {
//         return logLevel;
//     }
// 
//     public void setLogLevel(LogLevel logLevel) {
//         this.logLevel = logLevel;
//     }
// 
//     public KafkaProperties getKafka() {
//         return kafka;
//     }
// 
//     public void setKafka(KafkaProperties kafka) {
//         this.kafka = kafka;
//     }
// 
//     public FileProperties getFileProperties() {
//         return fileProperties;
//     }
// 
//     public String getPartten() {
//         return partten;
//     }
// 
//     public void setPartten(String partten) {
//         this.partten = partten;
//     }
// 
//     public void setFileProperties(FileProperties fileProperties) {
//         this.fileProperties = fileProperties;
//     }
// 
//     public Target[] getTargets() {
//         return targets;
//     }
// 
//     public void setTargets(Target[] targets) {
//         this.targets = targets;
//     }
// 
//     public String getHost() {
//         return host;
//     }
// 
//     public void setHost(String host) {
//         this.host = host;
//     }
// 
//     public int getPort() {
//         return port;
//     }
// 
//     public void setPort(int port) {
//         this.port = port;
//     }
// 
//     public String getApplication() {
//         return application;
//     }
// 
//     public void setApplication(String application) {
//         this.application = application;
//     }
// }
// 
// Path: xjob-util/xjob-util-log/log-util/src/main/java/org/shoper/log/util/constans/LogLevel.java
// public enum LogLevel {
//     Debug("DEBUG", 0), Info("INFO", 1), Warn("Warn", 2), Error("ERROR", 3), Fatal("FATAL", 4);
// 
//     LogLevel(String name, int value) {
//         this.name = name;
//         this.value = value;
//     }
// 
//     private String name;
//     private int value;
// 
//     private String getName() {
//         return name;
//     }
// 
//     private void setName(String name) {
//         this.name = name;
//     }
// 
//     private int getValue() {
//         return value;
//     }
// 
//     private void setValue(short value) {
//         this.value = value;
//     }
// 
//     /**
//      * 日志级别比较,0等于,-1小于,1大于
//      * @param logLevel
//      * @return
//      */
//     public int compare(LogLevel logLevel) {
//         if (this.value > logLevel.value) return 1;
//         else if (this == logLevel) return 0;
//         else return -1;
//     }
// }


// Path: xjob-util/xjob-util-log/log-util/src/main/java/org/shoper/log/util/Logger.java
import org.shoper.log.core.config.Constans;
import org.shoper.log.util.config.LogProperties;
import org.shoper.log.util.constans.LogLevel;
import javax.annotation.PreDestroy;
import java.util.Arrays;
import java.util.Objects;

            Object[] ts = null;
            if (obj[obj.length - 1] instanceof Throwable) {
                ts = Arrays.copyOf(obj, obj.length - 1, Object[].class);
                logInfo.setThrowable((Throwable) obj[obj.length - 1]);
            }
            logInfo.setMsg(String.format(formatter, Objects.nonNull(ts) ? ts : obj));
        } else {
            logInfo.setMsg(formatter);
        }

        return logInfo;
    }

    public void info(String formatter, Object... obj) {
        info(null, format(formatter, obj));
    }

//    public void info(String channel, String formatter, Object... obj) {
//        info(channel, format(formatter, obj));
//    }

    public void warn(LogInfo logMsg) {
        log(null, logMsg, Constans.WARN);
    }

    public void warn(String formatter, Object... obj) {
        warn(format(formatter, obj));
    }

    private void debug(LogInfo logMsg) {
        log(null, logMsg, Constans.DEBUG);