public void RollingFileLogger_HandleLogFolderRecreate()
        {
            var currentFolderPath = Path.GetDirectoryName(GetType().Assembly.Location);
            var logsFolder        = Path.Combine(currentFolderPath, "TestLogs");
            var logFile           = "";
            var log = new LogRecord
            {
                Timestamp = DateTime.Now,
                Message   = "str",
                Level     = LogLevel.Error,
                Exception = new Exception("Ex")
            };

            if (Directory.Exists(logsFolder))
            {
                Directory.Delete(logsFolder, true);
                Thread.Sleep(10);
            }

            var logger = new RollingFileLogger(logsFolder);

            logger.Log(log);

            logger.CastTo <IRollingFileLoggerInternal>().Writer.IsEnabled = false;
            logFile = logger.CastTo <IRollingFileLoggerInternal>().Writer.FilePath;

            Directory.GetFiles(logsFolder).Each(f => File.Delete(f));
            Directory.Delete(logsFolder, true);
            Thread.Sleep(10);

            logger.CastTo <IRollingFileLoggerInternal>().Writer.IsEnabled = true;

            Assert.DoesNotThrow(() => logger.Log(log));
            logger.Dispose();
        }
Example #2
0
        /// <summary>
        /// Creates a rolling file logger that creates log files based on
        /// the logging timestamp.
        /// </summary>
        /// <param name="baseFileName">The full path of the base log file,
        /// e.g. <c>C:\Folder\LogFile.txt</c>"</param>
        /// <param name="dateFormat">A format string that will be used to format the date
        /// portion of the log file name (e.g. <c>yyyyMMdd</c>)</param>
        /// <returns>Logger instance.</returns>
        public static ILogger CreateRollingFileLogger(string baseFileName, string dateFormat)
        {
            string fileName = Extensions.GetRollingFileFormat(baseFileName);

            var strategy = new RollingFileLogger.RollOverDateStrategy(fileName, dateFormat);
            var logger   = new RollingFileLogger(strategy);

            return(new BitFactoryLogger(logger));
        }
Example #3
0
        /// <summary>
        /// Creates a rolling file logger that switches log files depending on the
        /// log's size.
        /// </summary>
        /// <param name="baseFileName">The full path of the base log file,
        /// e.g. <c>C:\Folder\LogFile.txt</c>"</param>
        /// <param name="maxFileSize">The maximum file size.</param>
        /// <returns>Logger instance.</returns>
        /// <exception cref="ArgumentNullException">If <paramref name="baseFileName"/>
        /// is a null reference.</exception>
        public static ILogger CreateRollingFileLogger(string baseFileName, long maxFileSize)
        {
            if (baseFileName == null)
            {
                throw new ArgumentNullException("baseFileName");
            }

            string fileName = Extensions.GetRollingFileFormat(baseFileName);

            var strategy = new RollingFileLogger.RollOverSizeStrategy(fileName, maxFileSize);
            var logger   = new RollingFileLogger(strategy);

            return(new BitFactoryLogger(logger));
        }
        public void RollingFileLogger_CustomPipeline()
        {
            #region Arrange

            var currentFolderPath = Path.GetDirectoryName(GetType().Assembly.Location);
            var currentFolder     = new DirectoryInfo(currentFolderPath);

            var log = new LogRecord
            {
                Timestamp = DateTime.Now,
                Message   = "str",
                Level     = LogLevel.Error,
                Exception = new Exception("Ex")
            };

            var filePathTemplate = $"{currentFolderPath}\\log.txt";
            var lastFileMock     = new Mock <FileInformation>(filePathTemplate);
            lastFileMock.SetupGet(x => x.CreationTime).Returns(DateTime.Now);
            lastFileMock.SetupGet(x => x.FullName).Returns(filePathTemplate);
            lastFileMock.SetupGet(x => x.Exists).Returns(true);

            var files = new List <FileInformation> {
                lastFileMock.Object
            };

            new DirectoryInfo(currentFolderPath).GetFiles("*.txt").Each(x => x.Delete());

            var fileProviderMock = new Mock <IRollingFileProvider>();
            fileProviderMock.Setup(x => x.GetFiles()).Returns(() => files.ToArray());
            fileProviderMock.Setup(x => x.Directory).Returns(currentFolder);
            fileProviderMock.Setup(x => x.TryResolveLastFile()).Returns(lastFileMock.Object);
            fileProviderMock.Setup(x => x.ProduceNewFile()).Returns(() =>
            {
                var newFilePath = filePathTemplate.Replace(".txt", (files.Count + 1) + ".txt");

                var fm = new Mock <FileInformation>(newFilePath);
                fm.SetupGet(x => x.CreationTime).Returns(DateTime.Now);
                fm.SetupGet(x => x.FullName).Returns(newFilePath);
                fm.SetupGet(x => x.Exists).Returns(false);

                files.Add(fm.Object);

                return(fm.Object);
            });

            var logs = new List <LogRecord>();

            var pipes = new PipeCollection <RollingFileContext>()
                        .Add(new RollingFileWriterPipe())
                        .Add((c, n) =>
            {
                n(c);
                logs.AddRange(c.Batch);
            })
                        .Add((c, n) =>
            {
                c.Batch.Each(x => x.Message = x.Message.ToUpper());
                n(c);
            });

            var logger = new RollingFileLogger(fileProviderMock.Object)
            {
                Pipes = pipes
            };

            #endregion Arrange

            #region Act

            logger.Log(log);
            logger.Dispose();

            #endregion Act

            #region Assert

            var logFile = new FileInfo(lastFileMock.Object.FullName);

            Assert.IsTrue(logFile.Exists);
            Assert.AreEqual(1, logs.Count);
            Assert.AreSame(logs[0], log);
            Assert.AreEqual(logs[0].Message, log.Message.ToUpper());
            //because last file exists
            fileProviderMock.Verify(x => x.ProduceNewFile(), Times.Never());
            fileProviderMock.Verify(x => x.TryResolveLastFile(), Times.Once());

            new DirectoryInfo(currentFolderPath).GetFiles("*.txt").Each(x => x.Delete());

            #endregion Assert
        }
        public void RollingFileLogger_LogWithCustomFormat()
        {
            #region Arrange

            var currentFolderPath = Path.GetDirectoryName(GetType().Assembly.Location);
            var currentFolder     = new DirectoryInfo(currentFolderPath);

            var log = new LogRecord
            {
                Timestamp = DateTime.Now,
                Message   = "str",
                Level     = LogLevel.Error,
                Exception = new Exception("Ex")
            };

            var filePathTemplate = $"{currentFolderPath}\\log.txt";
            var lastFileMock     = new Mock <FileInformation>(filePathTemplate);
            lastFileMock.SetupGet(x => x.CreationTime).Returns(DateTime.Now);
            lastFileMock.SetupGet(x => x.FullName).Returns(filePathTemplate);
            lastFileMock.SetupGet(x => x.Exists).Returns(true);

            var files = new List <FileInformation> {
                lastFileMock.Object
            };

            new DirectoryInfo(currentFolderPath).GetFiles("*.txt").Each(x => x.Delete());

            var fileProviderMock = new Mock <IRollingFileProvider>();
            fileProviderMock.Setup(x => x.GetFiles()).Returns(() => files.ToArray());
            fileProviderMock.Setup(x => x.Directory).Returns(currentFolder);
            fileProviderMock.Setup(x => x.TryResolveLastFile()).Returns(lastFileMock.Object);
            fileProviderMock.Setup(x => x.ProduceNewFile()).Returns(() =>
            {
                var newFilePath = filePathTemplate.Replace(".txt", (files.Count + 1) + ".txt");

                var fm = new Mock <FileInformation>(newFilePath);
                fm.SetupGet(x => x.CreationTime).Returns(DateTime.Now);
                fm.SetupGet(x => x.FullName).Returns(newFilePath);
                fm.SetupGet(x => x.Exists).Returns(false);

                files.Add(fm.Object);

                return(fm.Object);
            });

            var logger = new RollingFileLogger(fileProviderMock.Object)
            {
                Serializer = new StringLogSerializerBuilder().Apply(s =>
                {
                    s.OutputTemplate += "{Ul}";
                    s.Formats["Ul"]   = r => "\n" + new string('-', 50);
                }).BuildSerializer()
            };

            #endregion Arrange

            #region Act

            logger.Log(log);
            logger.Dispose();

            #endregion Act

            #region Assert

            var logFile     = new FileInfo(lastFileMock.Object.FullName);
            var expectedStr = logger.Serializer.Serialize(log) + Environment.NewLine;

            Assert.IsTrue(logFile.Exists);
            Assert.AreEqual(expectedStr, File.ReadAllText(logFile.FullName));

            fileProviderMock.Verify(x => x.ProduceNewFile(), Times.Never());
            fileProviderMock.Verify(x => x.TryResolveLastFile(), Times.Exactly(2));

            new DirectoryInfo(currentFolderPath).GetFiles("*.txt").Each(x => x.Delete());

            #endregion Assert
        }