So, ad appender:
@Plugin(name="MyCustomAppender", category="Core", elementType="appender", printObject=true) public class Appender extends AbstractAppender { private final ReadWriteLock rwLock = new ReentrantReadWriteLock(); private final Lock readLock = rwLock.readLock(); protected Appender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions) { super(name, filter, layout, ignoreExceptions); } @PluginFactory public static Appender 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 MyCustomAppenderImp"); return null; } if (layout == null) { layout = PatternLayout.createDefaultLayout(); } return new Appender(name, filter, layout, true); } @Override public void append(LogEvent logEvent) { readLock.lock(); try { final byte[] bytes = getLayout().toByteArray(logEvent); //Здесь меняем значение у StringProperty String past = MainViewController.textAreaMessages.get()==null ?"":MainViewController.textAreaMessages.get(); StringBuilder s = new StringBuilder().append(past).append(new String(bytes, "UTF-8")); MainViewController.textAreaMessages.set(s.toString()); } catch (Exception ex) { if (!ignoreExceptions()) { throw new AppenderLoggingException(ex); } } finally { readLock.unlock(); } } }
Appender configuration in .xml file:
<Appenders> ... <MyCustomAppender name="toStringProperty" > <PatternLayout pattern=":%m%n" /> </MyCustomAppender> </Appenders> <Loggers> ... <Logger name="com.oaks" level="info"> <AppenderRef ref="toStringProperty"/> </Logger> </Loggers>