/** * Create a Console Appender. * @param layout The layout to use (required). * @param filter The Filter or null. * @param t The target ("SYSTEM_OUT" or "SYSTEM_ERR"). The default is "SYSTEM_OUT". * @param follow If true will follow changes to the underlying output stream. * @param name The name of the Appender (required). * @param ignore If {@code "true"} (default) exceptions encountered when appending events are logged; otherwise * they are propagated to the caller. * @return The ConsoleAppender. */ @PluginFactory public static ConsoleAppender createAppender( @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginElement("Filters") final Filter filter, @PluginAttribute("target") final String t, @PluginAttribute("name") final String name, @PluginAttribute("follow") final String follow, @PluginAttribute("ignoreExceptions") final String ignore) { if (name == null) { LOGGER.error("No name provided for ConsoleAppender"); return null; } if (layout == null) { layout = PatternLayout.createLayout(null, null, null, null, null); } final boolean isFollow = Boolean.parseBoolean(follow); final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true); final Target target = t == null ? Target.SYSTEM_OUT : Target.valueOf(t); return new ConsoleAppender(name, layout, filter, getManager(isFollow, target, layout), ignoreExceptions); }
protected RocketmqLog4j2Appender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, String nameServerAddress, String producerGroup, String topic, String tag) { super(name, filter, layout, ignoreExceptions); this.producer = producer; this.topic = topic; this.tag = tag; this.nameServerAddress = nameServerAddress; this.producerGroup = producerGroup; try { this.producer = ProducerInstance.getInstance(this.nameServerAddress, this.producerGroup); } catch (Exception e) { ErrorHandler handler = this.getHandler(); if (handler != null) { handler.error("Starting RocketmqLog4j2Appender [" + this.getName() + "] nameServerAddress:" + nameServerAddress + " group:" + producerGroup + " " + e.getMessage()); } } }
/** * @param name The appender name * @param filter The appender filter * @param layout The layout * @param ignoreExceptions True if we are to ignore exceptions during logging * @param maxDelayTime Max delay time in millis before sending the messages to the database * @param maxBulkSize Max buffer size of messages held in memory before sending * @param dateFormat Format of the timestamp that is appended to the esIndex name while saving * @param index The ElasticSearch destination index * @param type The ElasticSearch destination type * @param bulkSender The Elastic bulk sender */ protected ElasticSearchRestAppender(String name, Filter filter, Layout<? extends Serializable> layout, final boolean ignoreExceptions, final long maxDelayTime, final int maxBulkSize, DateFormat dateFormat, String index, String type, BulkSender bulkSender) { super(name, filter, layout, ignoreExceptions); this.buffered = new ArrayList<>(); this.timer = null; this.maxBulkSize = maxBulkSize; this.maxDelayTime = maxDelayTime; this.index = index; this.type = type; this.bulkSender = bulkSender; this.dateFormat = dateFormat; this.bulkItemFormat = String.format("{ \"index\" : { \"_index\" : \"%s%%s\", \"_type\" : \"%s\" } }%n%%s%n", index, type); this.validate(); }
protected final void registerParent(Class<? extends BaseLog4j2Configuration> clazz){ BaseLog4j2Configuration configuration; try{ configuration = clazz.newInstance(); }catch(InstantiationException | IllegalAccessException e){ throw new RuntimeException(e); } for(Appender appender : configuration.getAppenders()){ addAppender(appender); } for(LoggerConfig loggerConfig : configuration.getLoggerConfigs()){ addLoggerConfig(loggerConfig.getName(), loggerConfig.getLevel(), loggerConfig.isAdditive(), loggerConfig .getAppenders().values()); } for(Filter filter : configuration.getFilters()){ addFilter(filter); } }
/** * Factory method. Log4j will parse the configuration and call this factory * method to construct the appender with * the configured attributes. * * @param name Name of appender * @param layout Log layout of appender * @param filter Filter for appender * @return The TextAreaAppender */ @PluginFactory public static TextAreaAppender createAppender( @PluginAttribute("name") String name, @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginElement("Filter") final Filter filter) { if (name == null) { LOGGER.error("No name provided for TextAreaAppender"); return null; } if (layout == null) { layout = PatternLayout.createDefaultLayout(); } return new TextAreaAppender(name, filter, layout, true); }
@PluginFactory public static TerminalConsoleAppender createAppender(@PluginAttribute("name") String name, @PluginElement("Filters") Filter filter, @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginAttribute("ignoreExceptions") String ignore) { if (name == null) { LOGGER.error("No name provided for TerminalConsoleAppender"); return null; } if (layout == null) { layout = PatternLayout.createLayout(null, null, null, null, null); } boolean ignoreExceptions = parseBoolean(ignore, true); // This is handled by jline System.setProperty("log4j.skipJansi", "true"); return new TerminalConsoleAppender(name, filter, layout, ignoreExceptions); }
@PluginFactory public static ReportPortalLog4j2Appender createAppender(@PluginAttribute("name") String name, @PluginElement("filter") Filter filter, @PluginElement("layout") Layout<? extends Serializable> layout) { if (name == null) { LOGGER.error("No name provided for ReportPortalLog4j2Appender"); return null; } if (layout == null) { LOGGER.error("No layout provided for ReportPortalLog4j2Appender"); return null; } return new ReportPortalLog4j2Appender(name, filter, layout); }
@PluginFactory public static ConsoleLogAppender createAppender(@PluginAttribute("name") final String name, @PluginAttribute("ignoreExceptions") final String ignore, @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginElement("Filters") final Filter filter, @PluginAttribute("target") String target) { final boolean ignoreExceptions = Boolean.parseBoolean(ignore); if (name == null) { ConsoleLogAppender.LOGGER.error("No name provided for ConsoleLogAppender"); return null; } if (target == null) { target = name; } ConsoleLogAppender.QUEUE_LOCK.writeLock().lock(); BlockingQueue<String> queue = ConsoleLogAppender.QUEUES.get(target); if (queue == null) { queue = new LinkedBlockingQueue<>(); ConsoleLogAppender.QUEUES.put(target, queue); } ConsoleLogAppender.QUEUE_LOCK.writeLock().unlock(); if (layout == null) { layout = PatternLayout.createLayout(null, null, null, null, true, !Nukkit.useConsole, null, null); } return new ConsoleLogAppender(name, filter, layout, ignoreExceptions, queue); }
protected RocketmqLog4j2Appender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions, String nameServerAddress, String producerGroup, String topic, String tag) { super(name, filter, layout, ignoreExceptions); this.producer = producer; this.topic = topic; this.tag = tag; this.nameServerAddress = nameServerAddress; this.producerGroup = producerGroup; try { this.producer = ProducerInstance.getProducerInstance().getInstance(this.nameServerAddress, this.producerGroup); } catch (Exception e) { ErrorHandler handler = this.getHandler(); if (handler != null) { handler.error("Starting RocketmqLog4j2Appender [" + this.getName() + "] nameServerAddress:" + nameServerAddress + " group:" + producerGroup + " " + e.getMessage()); } } }
@PluginFactory public static WorkspaceLogAppender createAppender(@PluginAttribute("name") String name, @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginElement("Filter") final Filter filter) { if (name == null) { LOGGER.error("No name provided for WorkspaceLogAppender"); return null; } if (layout == null) { layout = PatternLayout.createDefaultLayout(); } return new WorkspaceLogAppender(name, filter, layout, true); }
private SlackAppender(String name, Filter filter, Layout<? extends Serializable> layout, final URL webhookUrl, final String username, final String channel, final boolean meltdownProtection, final int similarMessageSize, final int timeBetweenSimilarLogsMs, final Client client) { super(name, filter, layout, true); setWebhookUrl(webhookUrl); this.username = username; this.channel = channel; this.meltdownProtection = meltdownProtection; this.similarMessageSize = similarMessageSize; this.timeBetweenSimilarLogsMs = timeBetweenSimilarLogsMs; this.client = client; }
@PluginFactory public static SlackAppender createAppender( @PluginAttribute("name") String name, @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginElement("Filter") final Filter filter, @PluginAttribute("webhookUrl") URL webhookUrl, @PluginAttribute("channel") String channel, @PluginAttribute(value = "username", defaultString = "Blazkowicz") String username, @PluginAttribute(value = "meltdownProtection", defaultBoolean = true) boolean meltdownProtection, @PluginAttribute(value = "similarMessageSize", defaultInt = 50) int similarMessageSize, @PluginAttribute(value = "timeBetweenSimilarLogsMs", defaultInt = 60000) int timeBetweenSimilarLogsMs, @PluginAttribute(value = "packagesToMute", defaultString = "") String packagesToMute, @PluginAttribute(value = "httpClientImpl", defaultString = "") String httpClientImpl) { if (name == null) { LOGGER.error("No name provided for MyCustomAppenderImpl"); return null; } if (layout == null) { layout = PatternLayout.createDefaultLayout(); } Client client = findClientImpl(httpClientImpl); SlackAppender slackAppender = new SlackAppender(name, filter, layout, webhookUrl, username, channel, meltdownProtection, similarMessageSize, timeBetweenSimilarLogsMs, client); slackAppender.setPackagesToMute(packagesToMute); return slackAppender; }
@PluginFactory public static DebuggerAppender createAppender(@PluginAttribute("name") String name, @PluginElement("Layout") Layout<?> layout, @PluginElement("Filters") Filter filter, @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { if (name == null) { LOGGER.error("No name provided for JTextAreaAppender"); return null; } if (layout == null) { layout = PatternLayout.createDefaultLayout(); } return new DebuggerAppender(name, layout, filter, ignoreExceptions); }
/** * A custom appender needs to declare a factory method annotated with `@PluginFactory`. * Log4j will parse the configuration and call this factory method to construct an appender instance with * the configured attributes. * * @param name - the logger name * @param layout - the layout * @param filter - the filter * @param otherAttribute - other attributes * @return a text area logger */ @PluginFactory public static TextAreaLogger createAppender( @PluginAttribute("name") String name, @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginElement("Filter") final Filter filter, @PluginAttribute("otherAttribute") String otherAttribute) { if (name == null) { LOGGER.error("No name provided for MyCustomAppenderImpl"); return null; } if (layout == null) { layout = PatternLayout.createDefaultLayout(); } return new TextAreaLogger(name, filter, layout, true); }
@PluginFactory public static MongoFXMessageAppender createAppender(@PluginAttribute("name") String name, @PluginAttribute("ignoreExceptions") boolean ignoreExceptions, @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginElement("Filters") Filter filter) { if (name == null) { LOGGER.error("No name provided for StubAppender"); return null; } if (layout == null) { layout = PatternLayout.createDefaultLayout(); } return new MongoFXMessageAppender(name, filter, layout, ignoreExceptions); }
@Override public void registerListener(ListenerConfig cfg) { if (history != null) throw new IllegalStateException("History already registered"); history = new CircularList<LogEvent>(cfg.size); Level threshold = (cfg.threshold != null) ? Level.toLevel(cfg.threshold) : Level.WARN; ThresholdFilter filter = ThresholdFilter.createFilter(threshold, Filter.Result.ACCEPT, Filter.Result.DENY); appender = new Log4j2Appender(this, filter, threshold); if (!appender.isStarted()) appender.start(); LoggerContext ctx = (LoggerContext) LogManager.getContext(false); LoggerConfig config = getLoggerConfig(ctx, LoggerInfo.ROOT_NAME); config.addAppender(appender, threshold, filter); ctx.updateLoggers(); }
/** * Factory method for the appender * * @param name The Appender name * @param filter The Filter to associate with the Appender * @param apiUrl API URL * @param apiKey API Key * @param application Application name * @param environment Environment * @param skipJson Mark messages w/ JSON w/ #SKIPJSON * @param maskEnabled Mask Enabled * @param masks Masks * @return StackifyLogAppender */ @PluginFactory public static StackifyLogAppender createAppender(@PluginAttribute("name") final String name, @PluginElement("filters") final Filter filter, @PluginAttribute("apiUrl") final String apiUrl, @PluginAttribute("apiKey") final String apiKey, @PluginAttribute("application") final String application, @PluginAttribute("environment") final String environment, @PluginAttribute("skipJson") final String skipJson, @PluginAttribute("maskEnabled") final String maskEnabled, @PluginElement("mask") final Mask[] masks) { return new StackifyLogAppender(name, filter, apiUrl, apiKey, application, environment, skipJson == null || Boolean.parseBoolean(skipJson), maskEnabled == null || Boolean.parseBoolean(maskEnabled), masks); }
/** * Constructor. * * @param name The Appender name * @param filter The Filter to associate with the Appender * @param apiUrl API URL * @param apiKey API Key * @param application Application name * @param environment Environment * @param skipJson Mark messages w/ JSON w/ #SKIPJSON * @param maskEnabled Mask Enabled * @param masks Masks */ protected StackifyLogAppender(final String name, final Filter filter, final String apiUrl, final String apiKey, final String application, final String environment, final boolean skipJson, final boolean maskEnabled, final Mask[] masks) { super(name, filter, null); this.apiUrl = (apiUrl != null) ? apiUrl : DEFAULT_API_URL; this.apiKey = apiKey; this.application = application; this.environment = environment; this.skipJson = skipJson; this.maskEnabled = maskEnabled; this.masks = masks; }
/** * testConstructor */ @Test public void testConstructor() { String name = "STACKIFY"; Filter filter = Mockito.mock(Filter.class); String apiUrl = "url"; String apiKey = "key"; String application = "app"; String environment = "env"; StackifyLogAppender appender = StackifyLogAppender.createAppender(name, filter, apiUrl, apiKey, application, environment, null, null, null); Assert.assertNotNull(appender); Assert.assertEquals(name, appender.getName()); Assert.assertEquals(filter, appender.getFilter()); Assert.assertEquals(apiUrl, appender.getApiUrl()); Assert.assertEquals(apiKey, appender.getApiKey()); Assert.assertEquals(application, appender.getApplication()); Assert.assertEquals(environment, appender.getEnvironment()); }
@PluginFactory public static MemoryAppender createAppender( @PluginAttribute("name") String name, @PluginElement("Layout") Layout<? extends Serializable> layout, @PluginElement("Filter") final Filter filter, @PluginAttribute("numberOfLines") String numberOfLines) { if (name == null) { LOGGER.error("No name provided for MemoryAppender"); return null; } if (layout == null) { layout = PatternLayout.createDefaultLayout(); } if (numberOfLines != null) { logsize = Integer.valueOf(numberOfLines); } return new MemoryAppender(name, filter, layout, true); }
@PluginFactory public static ConsoleWindowAppender createAppender(@PluginAttribute("name") String name, @PluginAttribute("ignoreExceptions") boolean ignoreExceptions, @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter) { if (name == null) { LOGGER.error("No name provided for StubAppender"); return null; } if (layout == null) { layout = PatternLayout.createDefaultLayout(); } //noinspection unchecked return new ConsoleWindowAppender(name, filter, layout, ignoreExceptions); }
@PluginFactory public static JesterJAppender createAppender(@PluginAttribute("name") String name, @PluginAttribute("ignoreExceptions") boolean ignoreExceptions, @PluginElement("Layout") Layout layout, @PluginElement("Filters") Filter filter) { if (name == null) { LOGGER.error("No name provided for JesterJAppender"); return null; } manager = createManager(); if (manager == null) { return null; } if (layout == null) { layout = PatternLayout.createDefaultLayout(); } cassandra.addStatement(FTI_INSERT_Q, INSERT_FTI); cassandra.addStatement(REG_INSERT_Q, INSERT_REG); return new JesterJAppender(name, layout, filter, manager, ignoreExceptions); }
/** * Factory method called by the log4j initialization framework * <p> * @param name * @param ignoreExceptions * @param layout * @param filter * @return */ @PluginFactory public static SdiReportAppender createAppender( @PluginAttribute( "name" ) String name, @PluginAttribute( "ignoreExceptions" ) boolean ignoreExceptions, @PluginElement( "Layout" ) Layout<?> layout, @PluginElement( "Filters" ) Filter filter ) { if ( name == null ) { LOGGER.error( "No name provided for SdiReportAppender" ); return null; } return new SdiReportAppender( name, null, null ); }
@PluginFactory public static TerminalConsoleAppender createAppender( @PluginElement("Layout") @Nullable Layout<? extends Serializable> layout, @PluginAttribute("name") String name, @PluginElement("Filter") Filter filter, @PluginAttribute(value = "ignoreExceptions", defaultBoolean = true) boolean ignoreExceptions) { if (name == null) { LOGGER.error("No name provided for TerminalConsoleAppender"); return null; } if (layout == null) { layout = PatternLayout.createLayout(null, null, null, null, null, false, false, null, null); } // This is handled by jline System.setProperty("log4j.skipJansi", "true"); return new TerminalConsoleAppender(name, filter, layout, ignoreExceptions); }
SystemdJournalAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, SystemdJournalLibrary journalLibrary, boolean logSource, boolean logStacktrace, boolean logThreadName, boolean logLoggerName, boolean logAppenderName, boolean logThreadContext, String threadContextPrefix, String syslogIdentifier) { super(name, filter, layout, ignoreExceptions); this.journalLibrary = journalLibrary; this.logSource = logSource; this.logStacktrace = logStacktrace; this.logThreadName = logThreadName; this.logLoggerName = logLoggerName; this.logAppenderName = logAppenderName; this.logThreadContext = logThreadContext; if (threadContextPrefix == null) { this.threadContextPrefix = "THREAD_CONTEXT_"; } else { this.threadContextPrefix = normalizeKey(threadContextPrefix); } this.syslogIdentifier = syslogIdentifier; }
@PluginFactory public static JLineConsoleAppender createAppender(@PluginElement("Layout") Layout<? extends Serializable> layout, @PluginElement("Filters") final Filter filter, @PluginAttribute("target") final String t, @PluginAttribute("name") final String name, @PluginAttribute("follow") final String follow, @PluginAttribute("ignoreExceptions") final String ignore) { if (name == null) { LOGGER.error("No name provided for ConsoleAppender"); return null; } if (layout == null) { layout = PatternLayout.newBuilder().build(); } final boolean isFollow = Boolean.parseBoolean(follow); final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true); final Target target = t == null ? Target.SYSTEM_OUT : Target.valueOf(t); FactoryData data = new FactoryData(getStream(isFollow, target), layout); return new JLineConsoleAppender(name, layout, filter, getManager(isFollow, target, data), getHeldManager(isFollow, target, data), ignoreExceptions); }
/** * Factory method for creating a JDBC appender within the plugin manager. * * @see Builder * @deprecated use {@link #newBuilder()} */ @Deprecated public static <B extends Builder<B>> JdbcAppender createAppender(final String name, final String ignore, final Filter filter, final ConnectionSource connectionSource, final String bufferSize, final String tableName, final ColumnConfig[] columnConfigs) { Assert.requireNonEmpty(name, "Name cannot be empty"); Objects.requireNonNull(connectionSource, "ConnectionSource cannot be null"); Assert.requireNonEmpty(tableName, "Table name cannot be empty"); Assert.requireNonEmpty(columnConfigs, "ColumnConfigs cannot be empty"); final int bufferSizeInt = AbstractAppender.parseInt(bufferSize, 0); final boolean ignoreExceptions = Booleans.parseBoolean(ignore, true); return JdbcAppender.<B>newBuilder() .setBufferSize(bufferSizeInt) .setColumnConfigs(columnConfigs) .setConnectionSource(connectionSource) .setTableName(tableName) .withName(name) .withIgnoreExceptions(ignoreExceptions) .withFilter(filter) .build(); }