public void RetryingTargetWrapperTest2() { var target = new MyTarget() { ThrowExceptions = 6, }; var wrapper = new RetryingTargetWrapper() { WrappedTarget = target, RetryCount = 4, RetryDelayMilliseconds = 1, }; wrapper.Initialize(null); target.Initialize(null); var exceptions = new List <Exception>(); var events = new [] { new LogEventInfo(LogLevel.Debug, "Logger1", "Hello").WithContinuation(exceptions.Add), new LogEventInfo(LogLevel.Info, "Logger1", "Hello").WithContinuation(exceptions.Add), new LogEventInfo(LogLevel.Info, "Logger2", "Hello").WithContinuation(exceptions.Add), }; var internalLogOutput = RunAndCaptureInternalLog(() => wrapper.WriteAsyncLogEvents(events), LogLevel.Trace); string expectedLogOutput = @"Warn Error while writing to 'MyTarget': System.InvalidOperationException: Some exception has ocurred.. Try 1/4 Warn Error while writing to 'MyTarget': System.InvalidOperationException: Some exception has ocurred.. Try 2/4 Warn Error while writing to 'MyTarget': System.InvalidOperationException: Some exception has ocurred.. Try 3/4 Warn Error while writing to 'MyTarget': System.InvalidOperationException: Some exception has ocurred.. Try 4/4 Warn Too many retries. Aborting. Warn Error while writing to 'MyTarget': System.InvalidOperationException: Some exception has ocurred.. Try 1/4 Warn Error while writing to 'MyTarget': System.InvalidOperationException: Some exception has ocurred.. Try 2/4 "; Assert.AreEqual(expectedLogOutput, internalLogOutput); // first event does not get to wrapped target because of too many attempts. // second event gets there in 3rd retry // and third event gets there immediately Assert.AreEqual(2, target.Events.Count); Assert.AreSame(events[1].LogEvent, target.Events[0]); Assert.AreSame(events[2].LogEvent, target.Events[1]); Assert.AreEqual(events.Length, exceptions.Count, "Some continuations were not invoked."); Assert.IsNotNull(exceptions[0]); Assert.AreEqual("Some exception has ocurred.", exceptions[0].Message); Assert.IsNull(exceptions[1]); Assert.IsNull(exceptions[2]); }
public void RetryingTargetWrapperTest2() { var target = new MyTarget() { ThrowExceptions = 6, }; var wrapper = new RetryingTargetWrapper() { WrappedTarget = target, RetryCount = 4, RetryDelayMilliseconds = 1, }; wrapper.Initialize(null); target.Initialize(null); var exceptions = new List <Exception>(); var events = new [] { new LogEventInfo(LogLevel.Debug, "Logger1", "Hello").WithContinuation(exceptions.Add), new LogEventInfo(LogLevel.Info, "Logger1", "Hello").WithContinuation(exceptions.Add), new LogEventInfo(LogLevel.Info, "Logger2", "Hello").WithContinuation(exceptions.Add), }; var result = RunAndCaptureInternalLog(() => wrapper.WriteAsyncLogEvents(events), LogLevel.Trace); Assert.True(result.IndexOf("Error while writing to 'MyTarget'. Try 1/4") != -1); Assert.True(result.IndexOf("Error while writing to 'MyTarget'. Try 2/4") != -1); Assert.True(result.IndexOf("Error while writing to 'MyTarget'. Try 3/4") != -1); Assert.True(result.IndexOf("Error while writing to 'MyTarget'. Try 4/4") != -1); Assert.True(result.IndexOf("Too many retries. Aborting.") != -1); Assert.True(result.IndexOf("Error while writing to 'MyTarget'. Try 1/4") != -1); Assert.True(result.IndexOf("Error while writing to 'MyTarget'. Try 2/4") != -1); // first event does not get to wrapped target because of too many attempts. // second event gets there in 3rd retry // and third event gets there immediately Assert.Equal(2, target.Events.Count); Assert.Same(events[1].LogEvent, target.Events[0]); Assert.Same(events[2].LogEvent, target.Events[1]); Assert.Equal(events.Length, exceptions.Count); Assert.NotNull(exceptions[0]); Assert.Equal("Some exception has occurred.", exceptions[0].Message); Assert.Null(exceptions[1]); Assert.Null(exceptions[2]); }
public void RetryingTargetWrapperBlockingCloseTest() { RetryingIntegrationTest(3, () => { var target = new MyTarget() { ThrowExceptions = 5, }; var wrapper = new RetryingTargetWrapper() { WrappedTarget = target, RetryCount = 10, RetryDelayMilliseconds = 5000, }; var asyncWrapper = new AsyncTargetWrapper(wrapper) { TimeToSleepBetweenBatches = 1 }; asyncWrapper.Initialize(null); wrapper.Initialize(null); target.Initialize(null); var exceptions = new List <Exception>(); var events = new[] { new LogEventInfo(LogLevel.Debug, "Logger1", "Hello").WithContinuation(exceptions.Add), new LogEventInfo(LogLevel.Info, "Logger1", "Hello").WithContinuation(exceptions.Add), new LogEventInfo(LogLevel.Info, "Logger2", "Hello").WithContinuation(exceptions.Add), }; // Attempt to write LogEvents that will take forever to retry asyncWrapper.WriteAsyncLogEvents(events); // Wait a little for the AsyncWrapper to start writing System.Threading.Thread.Sleep(50); // Close down the AsyncWrapper while busy writing asyncWrapper.Close(); // Close down the RetryingWrapper while busy retrying wrapper.Close(); // Close down the actual target while busy writing target.Close(); // Wait a little for the RetryingWrapper to detect that it has been closed down System.Threading.Thread.Sleep(200); // The premature abort, causes the exception to be logged Assert.NotNull(exceptions[0]); }); }
static void Main(string[] args) { FileTarget wrappedTarget = new FileTarget(); wrappedTarget.FileName = "${basedir}/file.txt"; RetryingTargetWrapper target = new RetryingTargetWrapper(); target.WrappedTarget = wrappedTarget; target.RetryCount = 3; target.RetryDelayMilliseconds = 1000; NLog.Config.SimpleConfigurator.ConfigureForTargetLogging(target, LogLevel.Debug); Logger logger = LogManager.GetLogger("Example"); logger.Debug("log message"); }
public void RetryingTargetWrapperTest1() { var target = new MyTarget(); var wrapper = new RetryingTargetWrapper() { WrappedTarget = target, RetryCount = 10, RetryDelayMilliseconds = 1, }; wrapper.Initialize(null); target.Initialize(null); var exceptions = new List <Exception>(); var events = new [] { new LogEventInfo(LogLevel.Debug, "Logger1", "Hello").WithContinuation(exceptions.Add), new LogEventInfo(LogLevel.Info, "Logger1", "Hello").WithContinuation(exceptions.Add), new LogEventInfo(LogLevel.Info, "Logger2", "Hello").WithContinuation(exceptions.Add), }; wrapper.WriteAsyncLogEvents(events); // make sure all events went through Assert.Equal(3, target.Events.Count); Assert.Same(events[0].LogEvent, target.Events[0]); Assert.Same(events[1].LogEvent, target.Events[1]); Assert.Same(events[2].LogEvent, target.Events[2]); Assert.Equal(events.Length, exceptions.Count); // make sure there were no exception foreach (var ex in exceptions) { Assert.Null(ex); } }
public static void Init() { var config = LogManager.Configuration ?? new LoggingConfiguration(); var debugRule = config.LoggingRules.FirstOrDefault(l => l.LoggerNamePattern == DEBUG_LOGGER); var auditRule = config.LoggingRules.FirstOrDefault(l => l.LoggerNamePattern == AUDIT_LOGGER); if (debugRule != null && auditRule != null && !_noConfig) { _debugLogger = LogManager.GetLogger(DEBUG_LOGGER); _auditLogger = LogManager.GetLogger(AUDIT_LOGGER); return; } _noConfig = true; EventLogTarget syslog = new EventLogTarget(); syslog.Source = Bootstrap.getAppUser(); syslog.Name = "EventLog"; //syslog.Category = 0; //syslog.EntryType = ""; //syslog.EventId = ""; syslog.Layout = "${message}${newline}${exception:format=ToString}"; FileTarget fileTarget = new FileTarget(); RetryingTargetWrapper retryTargetWrapper = new RetryingTargetWrapper(fileTarget, 3, 100); AsyncTargetWrapper asyncTargetWrapper = new AsyncTargetWrapper(retryTargetWrapper); config.AddTarget("async", asyncTargetWrapper); fileTarget.Layout = @"${longdate} ${level} ${message}"; var agentConfig = Agent.Instance.HasConfig() ? Agent.Instance.GetSingle("com.sun.identity.agents.config.local.log.path") : null; String prefix = ConfigurationManager.AppSettings["com.sun.identity.agents.config.local.log.path"] != null ? ConfigurationManager.AppSettings["com.sun.identity.agents.config.local.log.path"] : agentConfig; fileTarget.FileName = (String.IsNullOrWhiteSpace(prefix)?"${basedir}/App_Data/Logs":prefix) + "/${logger}/${date:format=yyyy-MM-dd}.log"; fileTarget.Encoding = Encoding.UTF8; LogLevel nlogLevel = LogLevel.Info; //default level // todo проверить //TODO failover FATAL log to WINDOWS SYSTEM LOG if (Agent.Instance.HasConfig()) { //logAudit = Agent.Instance.GetSingle("com.sun.identity.agents.config.audit.accesstype") == "LOG_ALLOW"; auditLevel = Agent.Instance.GetSingle("com.sun.identity.agents.config.audit.accesstype"); if (Agent.Instance.GetSingle("com.sun.identity.agents.config.local.log.rotate") == "true") { long temp; fileTarget.ArchiveAboveSize = 104857600; fileTarget.MaxArchiveFiles = 9999; fileTarget.ArchiveFileName = (String.IsNullOrWhiteSpace(prefix) ? "${basedir}/App_Data/Logs" : prefix) + "/${logger}/${date:format=yyyy-MM-dd}_{#}.log"; fileTarget.ArchiveNumbering = ArchiveNumberingMode.Sequence; fileTarget.ArchiveEvery = FileArchivePeriod.Hour; if (long.TryParse(Agent.Instance.GetSingle("com.sun.identity.agents.config.local.log.size"), out temp)) { fileTarget.ArchiveAboveSize = temp; } } var configLevel = Agent.Instance.GetSingle("com.sun.identity.agents.config.debug.level"); switch (configLevel) { case "Error": nlogLevel = LogLevel.Error; break; case "Warning": nlogLevel = LogLevel.Warn; break; case "Info": nlogLevel = LogLevel.Info; break; default: nlogLevel = LogLevel.Trace; break; } } lock (_sync){ var oldRule = config.LoggingRules.FirstOrDefault(l => l.LoggerNamePattern == DEBUG_LOGGER); if (oldRule != null) { config.LoggingRules.Remove(oldRule); } var rule = new LoggingRule(DEBUG_LOGGER, nlogLevel, fileTarget); config.LoggingRules.Add(rule); oldRule = config.LoggingRules.FirstOrDefault(l => l.LoggerNamePattern == AUDIT_LOGGER); if (oldRule != null) { config.LoggingRules.Remove(oldRule); } var rule2 = new LoggingRule(AUDIT_LOGGER, LogLevel.Info, fileTarget); config.LoggingRules.Add(rule2); oldRule = config.LoggingRules.FirstOrDefault(l => l.LoggerNamePattern == "*"); if (oldRule != null) { config.LoggingRules.Remove(oldRule); } config.LoggingRules.Add(new LoggingRule("*", LogLevel.Fatal, syslog)); LogManager.Configuration = config; _debugLogger = LogManager.GetLogger(DEBUG_LOGGER); _auditLogger = LogManager.GetLogger(AUDIT_LOGGER); } }