diff --git a/src/Squidex.Infrastructure/Log/FileChannel.cs b/src/Squidex.Infrastructure/Log/FileChannel.cs index 51ec006ab..c5d8d37f1 100644 --- a/src/Squidex.Infrastructure/Log/FileChannel.cs +++ b/src/Squidex.Infrastructure/Log/FileChannel.cs @@ -9,9 +9,11 @@ using Squidex.Infrastructure.Log.Internal; namespace Squidex.Infrastructure.Log { - public sealed class FileChannel : DisposableObjectBase, ILogChannel, IInitializable + public sealed class FileChannel : DisposableObjectBase, ILogChannel { private readonly FileLogProcessor processor; + private readonly object lockObject = new object(); + private bool isInitialized; public FileChannel(string path) { @@ -30,12 +32,20 @@ namespace Squidex.Infrastructure.Log public void Log(SemanticLogLevel logLevel, string message) { - processor.EnqueueMessage(new LogMessageEntry { Message = message }); - } + if (!isInitialized) + { + lock (lockObject) + { + if (!isInitialized) + { + processor.Initialize(); - public void Initialize() - { - processor.Connect(); + isInitialized = true; + } + } + } + + processor.EnqueueMessage(new LogMessageEntry { Message = message }); } } } diff --git a/src/Squidex.Infrastructure/Log/Internal/FileLogProcessor.cs b/src/Squidex.Infrastructure/Log/Internal/FileLogProcessor.cs index fa60d61f8..42495544d 100644 --- a/src/Squidex.Infrastructure/Log/Internal/FileLogProcessor.cs +++ b/src/Squidex.Infrastructure/Log/Internal/FileLogProcessor.cs @@ -20,6 +20,7 @@ namespace Squidex.Infrastructure.Log.Internal private readonly BlockingCollection messageQueue = new BlockingCollection(MaxQueuedMessages); private readonly Task outputTask; private readonly string path; + private StreamWriter writer; public FileLogProcessor(string path) { @@ -45,16 +46,33 @@ namespace Squidex.Infrastructure.Log.Internal throw; } } + finally + { + writer.Dispose(); + } } } - public void Connect() + public void Initialize() { var fileInfo = new FileInfo(path); + try + { + if (!fileInfo.Directory.Exists) + { + fileInfo.Directory.Create(); + } - if (!fileInfo.Directory.Exists) + var fs = new FileStream(fileInfo.FullName, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); + + writer = new StreamWriter(fs, Encoding.UTF8); + writer.AutoFlush = true; + + writer.WriteLine($"--- Started Logging {DateTime.UtcNow} ---", 1); + } + catch (Exception ex) { - throw new ConfigurationException($"Log directory '{fileInfo.Directory.FullName}' does not exist."); + throw new ConfigurationException($"Log directory '{fileInfo.Directory.FullName}' does not exist or cannot be created.", ex); } } @@ -71,8 +89,7 @@ namespace Squidex.Infrastructure.Log.Internal { try { - File.AppendAllText(path, entry.Message + Environment.NewLine, Encoding.UTF8); - + writer.WriteLine(entry.Message); break; } catch (Exception ex) diff --git a/src/Squidex/Config/Domain/LoggingServices.cs b/src/Squidex/Config/Domain/LoggingServices.cs index 486c29dff..3c82a100b 100644 --- a/src/Squidex/Config/Domain/LoggingServices.cs +++ b/src/Squidex/Config/Domain/LoggingServices.cs @@ -38,8 +38,7 @@ namespace Squidex.Config.Domain if (!string.IsNullOrWhiteSpace(loggingFile)) { services.AddSingletonAs(file ?? (file = new FileChannel(loggingFile))) - .As() - .As(); + .As(); } var useColors = config.GetValue("logging:colors");