Unfortunately, the appender has no idea how much data is being buffered as the buffer is managed by the Socket.
Ralph On Mar 27, 2013, at 4:11 AM, Daniele Menotti wrote: > > Thanks for your reply Ralph. > > In order to preserve the performance could be better to guarantee that when > the buffer gets full and the I/O takes place, the entire content of the > buffer is written on the alternative appender, instead of only the last > message. This will guarantee that all logs are tracked in some way and the > performace is not affected. > > Is it feasible? > > > >> Subject: Re: Problems with FileoverAppender >> From: ralph.go...@dslextreme.com >> Date: Tue, 26 Mar 2013 10:32:24 -0700 >> To: log4j-user@logging.apache.org >> >> I've been doing some work on the SocketAppender, which is the base for the >> SyslogAppender. The SocketAppender is not flushing the OutputStream on every >> send. From what I can tell this is causing the data to be buffered and the >> exception only gets thrown when the buffer gets full and actual I/O takes >> place. To fix this I will need to add an "immediate flush" option to force >> the I/O, but that is also probably going to negatively impact performance. >> >> Ralph >> >> >> On Mar 26, 2013, at 9:35 AM, Daniele Menotti wrote: >> >>> Hi all, >>> I'm writing an application where I want to log to a Syslog server. I'm >>> doing it using a FailoverAppender, so when the Syslog server is down I can >>> log to a local file. I'm using Log4j 2.0beta4. >>> >>> Here is my log4j2.xml configuration file: >>> >>> <configuration> >>> <appenders> >>> <RollingFile name="RollingFile" fileName="logs/app.log" >>> filePattern="logs/archive/app_%d{yyyy-MM-dd}.log" immediateFlush="true" >>> suppressExceptions="false"> >>> <PatternLayout> >>> <pattern>%d %-5p - %m%n</pattern> >>> </PatternLayout> >>> <Policies> >>> <TimeBasedTriggeringPolicy /> >>> </Policies> >>> </RollingFile> >>> <Syslog name="Syslog_local0" host="16.63.165.60" port="514" protocol="TCP" >>> appName="LogTester" immediateFlush="true" facility="LOCAL0" newLine="true" >>> reconnectionDelay="1" suppressExceptions="false"/> >>> <Failover name="Failover" primary="Syslog_local0" retryInterval="3" >>> suppressExceptions="false"> >>> <Failovers> >>> <appender-ref ref="RollingFile"/> >>> </Failovers> >>> </Failover> >>> </appenders> >>> <loggers> >>> <root level="debug"> >>> <appender-ref ref="Failover"/> >>> </root> >>> </loggers> >>> </configuration> >>> >>> Now, I tried some scenarios: >>> >>> Syslog server is up when my application starts and it remains up till the >>> end: I can log to Syslog without problems ;-) >>> Syslog server is down when my application starts and it remains always >>> down: I don't log to Syslog, but I log to my local file, as expected ;-) >>> Syslog server is up when my application starts, than it goes down - for >>> example I log message1 to Syslog, than I put the server down and I log >>> message2 and message3: in this case I can log message1 to Syslog and when >>> my application tries to log message2 I get an Exception: ERROR StatusLogger >>> Unable to write to stream TCP:16.63.165.60:514 for appender Syslog_local0 >>> ERROR StatusLogger An exception occurred processing Appender Syslog_local0 >>> org.apache.logging.log4j.core.appender.AppenderRuntimeException: Error >>> writing to TCP:16.63.165.60:514 >>> at >>> org.apache.logging.log4j.core.net.TCPSocketManager.write(TCPSocketManager.java:120) >>> at >>> org.apache.logging.log4j.core.appender.OutputStreamManager.write(OutputStreamManager.java:127) >>> at >>> org.apache.logging.log4j.core.appender.AbstractOutputStreamAppender.append(AbstractOutputStreamAppender.java:115) >>> at >>> org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:102) >>> at >>> org.apache.logging.log4j.core.appender.FailoverAppender.callAppender(FailoverAppender.java:122) >>> at >>> org.apache.logging.log4j.core.appender.FailoverAppender.append(FailoverAppender.java:109) >>> at >>> org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:102) >>> at >>> org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:335) >>> at >>> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:316) >>> at >>> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:281) >>> at org.apache.logging.log4j.core.Logger.log(Logger.java:108) >>> at org.apache.logging.log4j.spi.AbstractLogger.info(AbstractLogger.java:657) >>> at com.hp.prp.util.log.SyslogLogger.info(SyslogLogger.java:82) >>> at com.hp.prp.util.log.Prova.main(Prova.java:25) >>> Caused by: java.net.SocketException: Software caused connection abort: >>> socket write error >>> at java.net.SocketOutputStream.socketWrite0(Native Method) >>> at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) >>> at java.net.SocketOutputStream.write(SocketOutputStream.java:136) >>> at >>> org.apache.logging.log4j.core.net.TCPSocketManager.write(TCPSocketManager.java:111) >>> ... 13 more >>> >>> message2 is lost and message3 is logged to the local file.... So why >>> message2 becomes lost?? How can I do to log it to the local file as I >>> expect? >>> >>> 4. Syslog server is down when my application starts, than it goes up - for >>> example I log message1 to the local file, than I put the server up and I >>> log message2 and message3 to Syslog: in this case logging works fine >>> because fileoverAppender tries the primary appender every 3 seconds. >>> >>> How can I do to resolve my problems in scenario 3? >>> >>> Thanks in advance, >>> Daniele >>> >>> >>> >> >> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org >> For additional commands, e-mail: log4j-user-h...@logging.apache.org >> > --------------------------------------------------------------------- To unsubscribe, e-mail: log4j-user-unsubscr...@logging.apache.org For additional commands, e-mail: log4j-user-h...@logging.apache.org