private void registerLogFileTailThreads() throws IOException { final Collection<String> outputFileNames = new HashSet<>(); final Collection<Appender> loggerAppenders = this.loggerContext.getConfiguration().getAppenders().values(); loggerAppenders.forEach(appender -> { if (appender instanceof FileAppender) { outputFileNames.add(((FileAppender) appender).getFileName()); } else if (appender instanceof RandomAccessFileAppender) { outputFileNames.add(((RandomAccessFileAppender) appender).getFileName()); } else if (appender instanceof RollingFileAppender) { outputFileNames.add(((RollingFileAppender) appender).getFileName()); } else if (appender instanceof MemoryMappedFileAppender) { outputFileNames.add(((MemoryMappedFileAppender) appender).getFileName()); } else if (appender instanceof RollingRandomAccessFileAppender) { outputFileNames.add(((RollingRandomAccessFileAppender) appender).getFileName()); } }); outputFileNames.forEach(s -> { final Tailer t = new Tailer(new File(s), new LogTailerListener(), 100, false, true); final Thread thread = new Thread(t); thread.setPriority(Thread.MIN_PRIORITY); thread.setName(s); thread.start(); }); }
/** * File appender types do not share a "write-to-file" superclass. */ private String extractFileName(Appender a) { if (a instanceof FileAppender) { return ((FileAppender) a).getFileName(); } else if (a instanceof RollingFileAppender) { return ((RollingFileAppender) a).getFileName(); } else if (a instanceof RollingRandomAccessFileAppender) { return ((RollingRandomAccessFileAppender) a).getFileName(); } else if (a instanceof RandomAccessFileAppender) { return ((RandomAccessFileAppender) a).getFileName(); } else if (a instanceof MemoryMappedFileAppender) { return ((MemoryMappedFileAppender) a).getFileName(); } else { return null; } }
@Override public void initTargetAppender() { LoggerContext ctx = (LoggerContext) LogManager.getContext(false); // get log file path from existing file appender RollingRandomAccessFileAppender mainFile = (RollingRandomAccessFileAppender) ctx.getConfiguration().getAppender("mainFile"); String pathPrefix = mainFile == null ? System.getProperty("user.dir") + StringUtils.replace("/target/log", "/", File.separator) + File.separator : StringUtils.replace(mainFile.getFileName(), "core.log", StringUtils.EMPTY); targetAppender = FileAppender.newBuilder() .withName(getTargetAppenderName()) .withAppend(true) .withFileName(pathPrefix + getTargetAppenderName() + ".log") .withLayout( PatternLayout.newBuilder() .withPattern("%d{HH:mm:ss.SSS} %-5level %logger - %msg%n") .build()). build(); }
@Override public void initTargetAppender() { LoggerContext ctx = (LoggerContext) LogManager.getContext(false); // get log file path from existing file appender RollingRandomAccessFileAppender mainFile = (RollingRandomAccessFileAppender) ctx.getConfiguration().getAppender("mainFile"); String pathPrefix = StringUtils.replace(mainFile.getFileName(), "core.log", StringUtils.EMPTY); targetAppender = FileAppender.newBuilder(). withName(getTargetAppenderName()). withAppend(true). withFileName(pathPrefix + getTargetAppenderName() + ".log"). withLayout( PatternLayout.newBuilder() .withPattern("%d{HH:mm:ss.SSS} %-5level %logger - %msg%n") .build()) .build(); }
/** * Creates a new {@link RollingFileAppender} * @param fileName The log file * @param loggingConfig The logging config * @param layout The layout * @param strategy the rollover strategy * @param rolledFileFormat The log file roll pattern * @param trigger The roll trigger * @return the new appender */ protected Appender createRollingRandomAccessFileAppender(final String fileName, Configuration loggingConfig, PatternLayout layout, final DefaultRolloverStrategy strategy, final String rolledFileFormat, final TriggeringPolicy trigger) { RollingRandomAccessFileManager fileManager = RollingRandomAccessFileManager.getRollingRandomAccessFileManager( fileName, rolledFileFormat, true, true, 8192, trigger, strategy, null, layout ); trigger.initialize(fileManager); return RollingRandomAccessFileAppender.createAppender( fileName, // file name rolledFileFormat, // rolled file name pattern "true", // append getClass().getSimpleName(), // appender name "true", // immediate flush "8192", // buffer size trigger, // triggering policy strategy, // rollover strategy layout, // layout null, // filter "true", // ignore exceptions null, // advertise null, // advertise uri loggingConfig); // config }
/** * Tests LOG4J2-1740 Add CronTriggeringPolicy programmatically leads to NPE */ @Test public void testRollingRandomAccessFileAppender() { // @formatter:off RollingRandomAccessFileAppender.newBuilder() .withName("test2") .withFileName("target/testcmd2.log") .withFilePattern("target/testcmd2.log.%d{yyyy-MM-dd}") .withPolicy(createPolicy()) .withStrategy(createStrategy()) .setConfiguration(configuration) .build(); // @formatter:on }
/** * Gets configuration as JSON. * Depends on the log4j core API. * * @param request the request * @param response the response * @return the configuration * @throws Exception the exception */ @GetMapping(value = "/getConfiguration") @ResponseBody public Map<String, Object> getConfiguration(final HttpServletRequest request, final HttpServletResponse response) throws Exception { ensureEndpointAccessIsAuthorized(request, response); Assert.notNull(this.loggerContext); final Collection<Map<String, Object>> configuredLoggers = new HashSet<>(); getLoggerConfigurations().forEach(config -> { final Map<String, Object> loggerMap = new HashMap<>(); loggerMap.put("name", StringUtils.defaultIfBlank(config.getName(), LOGGER_NAME_ROOT)); loggerMap.put("state", config.getState()); if (config.getProperties() != null) { loggerMap.put("properties", config.getProperties()); } loggerMap.put("additive", config.isAdditive()); loggerMap.put("level", config.getLevel().name()); final Collection<String> appenders = new HashSet<>(); config.getAppenders().keySet().stream().map(key -> config.getAppenders().get(key)).forEach(appender -> { final ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE); builder.append("name", appender.getName()); builder.append("state", appender.getState()); builder.append("layoutFormat", appender.getLayout().getContentFormat()); builder.append("layoutContentType", appender.getLayout().getContentType()); if (appender instanceof FileAppender) { builder.append(FILE_PARAM, ((FileAppender) appender).getFileName()); builder.append(FILE_PATTERN_PARAM, "(none)"); } if (appender instanceof RandomAccessFileAppender) { builder.append(FILE_PARAM, ((RandomAccessFileAppender) appender).getFileName()); builder.append(FILE_PATTERN_PARAM, "(none)"); } if (appender instanceof RollingFileAppender) { builder.append(FILE_PARAM, ((RollingFileAppender) appender).getFileName()); builder.append(FILE_PATTERN_PARAM, ((RollingFileAppender) appender).getFilePattern()); } if (appender instanceof MemoryMappedFileAppender) { builder.append(FILE_PARAM, ((MemoryMappedFileAppender) appender).getFileName()); builder.append(FILE_PATTERN_PARAM, "(none)"); } if (appender instanceof RollingRandomAccessFileAppender) { builder.append(FILE_PARAM, ((RollingRandomAccessFileAppender) appender).getFileName()); builder.append(FILE_PATTERN_PARAM, ((RollingRandomAccessFileAppender) appender).getFilePattern()); } appenders.add(builder.build()); }); loggerMap.put("appenders", appenders); configuredLoggers.add(loggerMap); }); final Map<String, Object> responseMap = new HashMap<>(); responseMap.put("loggers", configuredLoggers); return responseMap; }
public static void initialize() { // REDIRECT JAVA UTIL LOGGER TO LOG4J2 (MUST BE BEFORE ALL LOG4J2 CALLS) System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); // STARTING CONFIGURATION final LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false); org.apache.logging.log4j.core.config.Configuration configuration = loggerContext.getConfiguration(); LoggerConfig rootLogger = configuration.getLoggerConfig(""); rootLogger.setLevel(Level.ALL); // PATTERNS PatternLayout consolePattern = PatternLayout.createLayout("%d{yyyy-MM-dd HH:mm:ss} [%level] [%logger{1}]: %msg%n", configuration, null, null, true, false, null, null); PatternLayout logfilePattern = PatternLayout.createLayout("%d{yyyy-MM-dd HH:mm:ss} [%level] [%logger]: %msg%n", configuration, null, null, true, false, null, null); // LOG FILE STRINGS String logName = "NoMoreOversleeps"; String logFilePrefix = PlatformData.installationDirectory.getAbsolutePath().replace("\\", "/") + "/logs/" + WordUtils.capitalizeFully(logName, new char[] { '_', '-', ' ' }).replaceAll("_", "").replaceAll("_", "").replaceAll("-", "").replaceAll(" ", ""); // CLIENT LOG FILE APPENDER (ROLLING) RollingRandomAccessFileAppender clientInfoLogFile = RollingRandomAccessFileAppender.createAppender(logFilePrefix + "-0.log", logFilePrefix + "-%i.log", null, "InfoFile", null, null, OnStartupTriggeringPolicy.createPolicy(), DefaultRolloverStrategy.createStrategy("2", "1", "min", null, configuration), logfilePattern, null, null, null, null, configuration); clientInfoLogFile.start(); configuration.addAppender(clientInfoLogFile); rootLogger.addAppender(clientInfoLogFile, Level.INFO, null); /* // FINER DETAIL LOG FILE (REPLACED ON EACH RUN) RandomAccessFileAppender detailLogFile = RandomAccessFileAppender.createAppender(logFilePrefix + "-latest-fine.log", "false", "DetailFile", null, null, null, logfilePattern, null, null, null, configuration); detailLogFile.start(); configuration.addAppender(detailLogFile); rootLogger.addAppender(detailLogFile, Level.ALL, null); */ // CONSOLE APPENDER ConsoleAppender console = ConsoleAppender.createAppender(consolePattern, null, "SYSTEM_OUT", "Console", null, null); // must be named "Console" to work correctly console.start(); configuration.addAppender(console); rootLogger.addAppender(console, Level.INFO, null); // UPDATE LOGGERS loggerContext.updateLoggers(); // REDIRECT STDOUT AND STDERR TO LOG4J2 System.setOut(new PrintStream(new StdOutErrOutputStream(LogManager.getLogger("java.lang.System.out"), Level.INFO))); System.setErr(new PrintStream(new StdOutErrOutputStream(LogManager.getLogger("java.lang.System.err"), Level.ERROR))); // set main engine log log = LogManager.getLogger(); // print opening header log.info("==============================================================================================================="); log.info(" NoMoreOversleeps v" + Main.VERSION); log.info(" (c) Robert James Dennington, " + Math.max(Calendar.getInstance().get(Calendar.YEAR), minCopyrightYear)); log.info("==============================================================================================================="); log.debug("The system log manager is " + System.getProperty("java.util.logging.manager")); log.info("Install path: " + PlatformData.installationDirectory.getAbsolutePath()); log.info("Computer name: " + PlatformData.computerName); log.info("Platform: " + PlatformData.platformName); }
public static void initialize(Application application) { // STORE APPLICATION FOR LATER USE Logging.application = application; // REDIRECT JAVA UTIL LOGGER TO LOG4J2 (MUST BE BEFORE ALL LOG4J2 CALLS) System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); // STARTING CONFIGURATION final LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false); org.apache.logging.log4j.core.config.Configuration configuration = loggerContext.getConfiguration(); LoggerConfig rootLogger = configuration.getLoggerConfig(""); rootLogger.setLevel(Level.ALL); // PATTERNS PatternLayout consolePattern = PatternLayout.createLayout("%d{yyyy-MM-dd HH:mm:ss} [%level] [%logger{1}]: %msg%n", null, configuration, null, null, true, false, null, null); PatternLayout logfilePattern = PatternLayout.createLayout("%d{yyyy-MM-dd HH:mm:ss} [%level] [%logger]: %msg%n", null, configuration, null, null, true, false, null, null); // LOG FILE STRINGS String logFilePrefix = PlatformData.installationDirectory.getAbsolutePath().replace("\\", "/") + "/logs/" + WordUtils.capitalizeFully(application.getName(), new char[] { '_', '-', ' ' }).replaceAll("_", "").replaceAll("_", "").replaceAll("-", "").replaceAll(" ", ""); // CLIENT LOG FILE APPENDER (ROLLING) RollingRandomAccessFileAppender clientInfoLogFile = RollingRandomAccessFileAppender.createAppender(logFilePrefix + "-0.log", logFilePrefix + "-%i.log", null, "InfoFile", null, null, OnStartupTriggeringPolicy.createPolicy(), DefaultRolloverStrategy.createStrategy("2", "1", "min", null, null, false, configuration), logfilePattern, null, null, null, null, configuration); clientInfoLogFile.start(); configuration.addAppender(clientInfoLogFile); rootLogger.addAppender(clientInfoLogFile, Level.INFO, null); // FINER DETAIL LOG FILE (REPLACED ON EACH RUN) RandomAccessFileAppender detailLogFile = RandomAccessFileAppender.createAppender(logFilePrefix + "-latest-fine.log", "false", "DetailFile", null, null, null, logfilePattern, null, null, null, configuration); detailLogFile.start(); configuration.addAppender(detailLogFile); rootLogger.addAppender(detailLogFile, Level.ALL, null); // CONSOLE APPENDER ConsoleAppender console = ConsoleAppender.createAppender(consolePattern, null, Target.SYSTEM_OUT, "Console", false, true); // must be named "Console" to work correctly console.start(); configuration.addAppender(console); rootLogger.addAppender(console, Level.INFO, null); // UPDATE LOGGERS loggerContext.updateLoggers(); // REDIRECT STDOUT AND STDERR TO LOG4J2 System.setOut(new PrintStream(new StdOutErrOutputStream(LogManager.getLogger("java.lang.System.out"), Level.INFO))); System.setErr(new PrintStream(new StdOutErrOutputStream(LogManager.getLogger("java.lang.System.err"), Level.ERROR))); // set main engine log log = LogManager.getLogger(); // print opening header log.info("==============================================================================================================="); log.info(" " + application.getName() + " v" + application.getVersion()); log.info(" (c) Robert James Dennington, " + Math.max(Calendar.getInstance().get(Calendar.YEAR), minCopyrightYear)); log.info("==============================================================================================================="); log.debug("The system log manager is " + System.getProperty("java.util.logging.manager")); log.info("Install path: " + PlatformData.installationDirectory.getAbsolutePath()); log.info("Computer name: " + PlatformData.computerName); log.info("Platform: " + PlatformData.platformName); }
public ForwardHandler(@Nullable RollingRandomAccessFileAppender log4jAppender) { this.log4jAppender = log4jAppender; }