コード例 #1
0
        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]);
        }
コード例 #2
0
        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]);
        }
コード例 #3
0
        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]);
            });
        }
コード例 #4
0
ファイル: Example.cs プロジェクト: zy850580380/NLog
    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");
    }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
        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);
            }
        }