package jane.core; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Enumeration; import java.util.jar.Manifest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.util.ContextInitializer; /** * 日志相关(静态类) */ public final class Log { static { System.setProperty("line.separator", "\n"); } /** * public给外面方便写日志 */ public static final Logger log = LoggerFactory.getLogger("jane"); public static final LoggerContext logCtx = (LoggerContext)LoggerFactory.getILoggerFactory(); public static final boolean hasTrace = log.isTraceEnabled(); public static final boolean hasDebug = log.isDebugEnabled(); public static final boolean hasInfo = log.isInfoEnabled(); public static final boolean hasWarn = log.isWarnEnabled(); public static final boolean hasError = log.isErrorEnabled(); static { Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { @Override public void uncaughtException(Thread t, Throwable e) { try { log.error("thread(" + t + "): uncaught fatal exception:", e); } catch(Throwable ex) { ex.printStackTrace(); } finally { e.printStackTrace(); } } }); } /** * 在日志中记录一些系统信息 */ public static void logSystemProperties(String[] args) { log.info("os = {} {} {}", System.getProperty("os.name"), System.getProperty("os.version"), System.getProperty("os.arch")); log.info("java.version = {}", System.getProperty("java.version")); log.info("java.class.path = {}", System.getProperty("java.class.path")); log.info("user.name = {}", System.getProperty("user.name")); log.info("user.dir = {}", System.getProperty("user.dir")); log.info("logback.path = {}", new ContextInitializer(logCtx).findURLOfDefaultConfigurationFile(true).getPath()); log.info("debug = {}, charset = {}, file.encoding = {}", Const.debug, Const.stringCharset, System.getProperty("file.encoding")); if(args != null) { for(int i = 0, n = args.length; i < n; ++i) log.info("arg{} = {}", i, args[i]); } } /** * 在日志中记录一些jar文件的创建时间 */ public static void logJarCreateTime() throws IOException { final String TAG = "Created-Time"; Enumeration<URL> urls = Log.class.getClassLoader().getResources("META-INF/MANIFEST.MF"); while(urls.hasMoreElements()) { URL url = urls.nextElement(); try(InputStream is = url.openStream()) { String time = new Manifest(is).getMainAttributes().getValue(TAG); if(time != null) Log.log.info("{}#{} = {}", url.getPath(), TAG, time); } } } /** * 关闭日志中的某个appender */ public static void removeAppender(String name) { for(ch.qos.logback.classic.Logger lc : logCtx.getLoggerList()) lc.detachAppender(name); } /** * 从命令行参数关闭日志中的某些appenders */ public static void removeAppendersFromArgs(String[] args) { for(String s : args) { if(s.startsWith("removeAppender=")) removeAppender(s.substring("removeAppender=".length())); } } /** * 关闭日志系统 * <p> * 应在系统退出前(ShutdownHook)最后执行 */ public static void shutdown() { logCtx.stop(); } private Log() { } }