From 0e50978f98ca53e3dd9d39efe893e813133b51b8 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Wed, 15 Jun 2016 13:43:40 +0200 Subject: [PATCH] Expanded logging --- Artemis/Artemis/App.config | 5 +- Artemis/Artemis/Artemis.csproj | 8 ++- Artemis/Artemis/ArtemisBootstrapper.cs | 4 ++ Artemis/Artemis/Managers/DeviceManager.cs | 4 +- Artemis/Artemis/Managers/EffectManager.cs | 2 - Artemis/Artemis/Managers/LoopManager.cs | 2 + Artemis/Artemis/Managers/MainManager.cs | 22 ++++----- Artemis/Artemis/Managers/ProfileManager.cs | 2 + Artemis/Artemis/Models/EffectModel.cs | 15 ++++++ Artemis/Artemis/NLog.config | 25 ---------- Artemis/Artemis/Settings/General.Designer.cs | 14 +++++- Artemis/Artemis/Settings/General.settings | 9 ++-- Artemis/Artemis/Settings/GeneralSettings.cs | 13 +++++ Artemis/Artemis/Utilities/Logging.cs | 47 ++++++++++++++++++ .../Flyouts/FlyoutSettingsViewModel.cs | 49 +++++++++---------- .../Views/Flyouts/FlyoutSettingsView.xaml | 28 +++++++++-- 16 files changed, 165 insertions(+), 84 deletions(-) delete mode 100644 Artemis/Artemis/NLog.config create mode 100644 Artemis/Artemis/Utilities/Logging.cs diff --git a/Artemis/Artemis/App.config b/Artemis/Artemis/App.config index b40177305..296d07d4d 100644 --- a/Artemis/Artemis/App.config +++ b/Artemis/Artemis/App.config @@ -280,7 +280,7 @@ - TypeWave + WindowsProfile @@ -306,6 +306,9 @@ Light + + Info + diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index a10013ee3..83e85ee8a 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -38,8 +38,8 @@ https://github.com/SpoinkyNL/Artemis/wiki/Frequently-Asked-Questions-%28FAQ%29 Artemis Artemis - 0 - 1.1.3.0 + 2 + 1.1.3.2 false true true @@ -452,6 +452,7 @@ + @@ -616,9 +617,6 @@ SettingsSingleFileGenerator VolumeDisplay.Designer.cs - - Always - Designer diff --git a/Artemis/Artemis/ArtemisBootstrapper.cs b/Artemis/Artemis/ArtemisBootstrapper.cs index 52719ec46..f4137ab37 100644 --- a/Artemis/Artemis/ArtemisBootstrapper.cs +++ b/Artemis/Artemis/ArtemisBootstrapper.cs @@ -5,6 +5,7 @@ using System.Windows; using System.Windows.Controls; using System.Windows.Forms; using Artemis.InjectionModules; +using Artemis.Utilities; using Artemis.ViewModels; using Caliburn.Micro; using Ninject; @@ -20,6 +21,9 @@ namespace Artemis public ArtemisBootstrapper() { + // Start logging before anything else + Logging.SetupLogging(Settings.General.Default.LogLevel); + CheckDuplicateInstances(); Initialize(); BindSpecialValues(); diff --git a/Artemis/Artemis/Managers/DeviceManager.cs b/Artemis/Artemis/Managers/DeviceManager.cs index b3eba9ba9..5e21c1579 100644 --- a/Artemis/Artemis/Managers/DeviceManager.cs +++ b/Artemis/Artemis/Managers/DeviceManager.cs @@ -25,8 +25,6 @@ namespace Artemis.Managers public DeviceManager(IEventAggregator events, ILogger logger, List deviceProviders) { _logger = logger; - _logger.Info("Intializing DeviceManager"); - _events = events; KeyboardProviders = deviceProviders.Where(d => d.Type == DeviceType.Keyboard) @@ -34,7 +32,7 @@ namespace Artemis.Managers MiceProviders = deviceProviders.Where(d => d.Type == DeviceType.Mouse).ToList(); HeadsetProviders = deviceProviders.Where(d => d.Type == DeviceType.Headset).ToList(); - _logger.Info("Intialized DeviceManager"); + _logger.Info("Intialized DeviceManager with {0} device providers", deviceProviders.Count); } public List HeadsetProviders { get; set; } diff --git a/Artemis/Artemis/Managers/EffectManager.cs b/Artemis/Artemis/Managers/EffectManager.cs index 0605ac372..b14b46bab 100644 --- a/Artemis/Artemis/Managers/EffectManager.cs +++ b/Artemis/Artemis/Managers/EffectManager.cs @@ -23,8 +23,6 @@ namespace Artemis.Managers public EffectManager(ILogger logger, IEventAggregator events, DeviceManager deviceManager) { _logger = logger; - _logger.Info("Intializing EffectManager"); - _events = events; _deviceManager = deviceManager; diff --git a/Artemis/Artemis/Managers/LoopManager.cs b/Artemis/Artemis/Managers/LoopManager.cs index ef358b3aa..e43641d85 100644 --- a/Artemis/Artemis/Managers/LoopManager.cs +++ b/Artemis/Artemis/Managers/LoopManager.cs @@ -28,6 +28,8 @@ namespace Artemis.Managers _loopTimer = new Timer(40); _loopTimer.Elapsed += Render; _loopTimer.Start(); + + _logger.Info("Intialized LoopManager"); } /// diff --git a/Artemis/Artemis/Managers/MainManager.cs b/Artemis/Artemis/Managers/MainManager.cs index 3d612aa7b..6d0df6330 100644 --- a/Artemis/Artemis/Managers/MainManager.cs +++ b/Artemis/Artemis/Managers/MainManager.cs @@ -23,22 +23,19 @@ namespace Artemis.Managers public delegate void PauseCallbackHandler(); private readonly IEventAggregator _events; - private readonly ILogger _logger; private readonly Timer _processTimer; public MainManager(IEventAggregator events, ILogger logger, LoopManager loopManager, DeviceManager deviceManager, EffectManager effectManager, ProfileManager profileManager) { - _logger = logger; + _events = events; + + Logger = logger; LoopManager = loopManager; DeviceManager = deviceManager; EffectManager = effectManager; ProfileManager = profileManager; - _logger.Info("Intializing MainManager"); - - _events = events; - _processTimer = new Timer(1000); _processTimer.Elapsed += ScanProcesses; _processTimer.Start(); @@ -57,12 +54,13 @@ namespace Artemis.Managers PipeServer = new PipeServer(); PipeServer.Start("artemis"); - _logger.Info("Intialized MainManager"); + Logger.Info("Intialized MainManager"); } [Inject] public Lazy ShellViewModel { get; set; } + public ILogger Logger { get; set; } public LoopManager LoopManager { get; } public DeviceManager DeviceManager { get; set; } public EffectManager EffectManager { get; set; } @@ -76,7 +74,7 @@ namespace Artemis.Managers public void Dispose() { - _logger.Debug("Shutting down MainManager"); + Logger.Debug("Shutting down MainManager"); _processTimer?.Stop(); _processTimer?.Dispose(); @@ -91,7 +89,7 @@ namespace Artemis.Managers /// public void EnableProgram() { - _logger.Debug("Enabling program"); + Logger.Debug("Enabling program"); ProgramEnabled = true; LoopManager.StartAsync(); _events.PublishOnUIThread(new ToggleEnabled(ProgramEnabled)); @@ -102,7 +100,7 @@ namespace Artemis.Managers /// public void DisableProgram() { - _logger.Debug("Disabling program"); + Logger.Debug("Disabling program"); LoopManager.Stop(); ProgramEnabled = false; _events.PublishOnUIThread(new ToggleEnabled(ProgramEnabled)); @@ -133,7 +131,7 @@ namespace Artemis.Managers { if (!runningProcesses.Any(p => p.ProcessName == activeGame.ProcessName && p.HasExited == false)) { - _logger.Info("Disabling game: {0}", activeGame.Name); + Logger.Info("Disabling game: {0}", activeGame.Name); EffectManager.DisableGame(activeGame); } } @@ -146,7 +144,7 @@ namespace Artemis.Managers if (newGame == null || EffectManager.ActiveEffect == newGame) return; // If it's not already enabled, do so. - _logger.Info("Detected and enabling game: {0}", newGame.Name); + Logger.Info("Detected and enabling game: {0}", newGame.Name); EffectManager.ChangeEffect(newGame, LoopManager); } } diff --git a/Artemis/Artemis/Managers/ProfileManager.cs b/Artemis/Artemis/Managers/ProfileManager.cs index 637743b75..433d91ac0 100644 --- a/Artemis/Artemis/Managers/ProfileManager.cs +++ b/Artemis/Artemis/Managers/ProfileManager.cs @@ -28,6 +28,8 @@ namespace Artemis.Managers var profilePreviewTimer = new Timer(500); profilePreviewTimer.Elapsed += SetupProfilePreview; profilePreviewTimer.Start(); + + _logger.Info("Intialized ProfileManager"); } public ProfilePreviewModel ProfilePreviewModel { get; set; } diff --git a/Artemis/Artemis/Models/EffectModel.cs b/Artemis/Artemis/Models/EffectModel.cs index d0ce7b961..471a7aeba 100644 --- a/Artemis/Artemis/Models/EffectModel.cs +++ b/Artemis/Artemis/Models/EffectModel.cs @@ -5,6 +5,8 @@ using System.Linq; using Artemis.Managers; using Artemis.Models.Interfaces; using Artemis.Models.Profiles; +using Newtonsoft.Json; +using NLog; using Brush = System.Windows.Media.Brush; namespace Artemis.Models @@ -16,6 +18,7 @@ namespace Artemis.Models public bool Initialized; public MainManager MainManager; public string Name; + private DateTime _lastTrace; protected EffectModel(MainManager mainManager, IDataModel dataModel) { @@ -49,6 +52,18 @@ namespace Artemis.Models // Get all enabled layers who's conditions are met var renderLayers = GetRenderLayers(renderMice, renderHeadsets); + // Trace debugging + if (DateTime.Now.AddSeconds(-2) > _lastTrace) + { + _lastTrace = DateTime.Now; + MainManager.Logger.Trace("Effect datamodel as JSON: \r\n{0}", + JsonConvert.SerializeObject(DataModel, Formatting.Indented)); + MainManager.Logger.Trace("Effect {0} has to render {1} layers", Name, renderLayers.Count); + foreach (var renderLayer in renderLayers) + MainManager.Logger.Trace(" Layer name: {0}, layer type: {1}", renderLayer.Name, + renderLayer.LayerType); + } + // Render the keyboard layer-by-layer keyboard = Profile.GenerateBitmap(renderLayers, DataModel, MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(4), false, true); diff --git a/Artemis/Artemis/NLog.config b/Artemis/Artemis/NLog.config deleted file mode 100644 index 970a53315..000000000 --- a/Artemis/Artemis/NLog.config +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Artemis/Artemis/Settings/General.Designer.cs b/Artemis/Artemis/Settings/General.Designer.cs index c2a4363c9..b639e7962 100644 --- a/Artemis/Artemis/Settings/General.Designer.cs +++ b/Artemis/Artemis/Settings/General.Designer.cs @@ -25,7 +25,7 @@ namespace Artemis.Settings { [global::System.Configuration.UserScopedSettingAttribute()] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("TypeWave")] + [global::System.Configuration.DefaultSettingValueAttribute("WindowsProfile")] public string LastEffect { get { return ((string)(this["LastEffect"])); @@ -130,5 +130,17 @@ namespace Artemis.Settings { this["Theme"] = value; } } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Info")] + public string LogLevel { + get { + return ((string)(this["LogLevel"])); + } + set { + this["LogLevel"] = value; + } + } } } diff --git a/Artemis/Artemis/Settings/General.settings b/Artemis/Artemis/Settings/General.settings index 9f7098932..521a80d33 100644 --- a/Artemis/Artemis/Settings/General.settings +++ b/Artemis/Artemis/Settings/General.settings @@ -1,11 +1,9 @@  - - + - TypeWave + WindowsProfile @@ -31,5 +29,8 @@ Light + + Info + \ No newline at end of file diff --git a/Artemis/Artemis/Settings/GeneralSettings.cs b/Artemis/Artemis/Settings/GeneralSettings.cs index 4101769ad..296ed2f52 100644 --- a/Artemis/Artemis/Settings/GeneralSettings.cs +++ b/Artemis/Artemis/Settings/GeneralSettings.cs @@ -5,6 +5,7 @@ using System.Runtime.InteropServices.ComTypes; using System.Windows; using Artemis.Utilities; using MahApps.Metro; +using NLog; namespace Artemis.Settings { @@ -76,6 +77,16 @@ namespace Artemis.Settings } } + public string LogLevel + { + get { return General.Default.LogLevel; } + set + { + if (General.Default.LogLevel == value) return; + General.Default.LogLevel = value; + } + } + private void ApplyGamestatePort() { // TODO: Restart Gamestate server with new port @@ -103,6 +114,7 @@ namespace Artemis.Settings ApplyAutorun(); ApplyTheme(); ApplyGamestatePort(); + Logging.SetupLogging(LogLevel); } private void ApplyTheme() @@ -136,6 +148,7 @@ namespace Artemis.Settings CheckForUpdates = true; ShowOnStartup = true; Theme = "Light"; + LogLevel = "Info"; SaveSettings(); } diff --git a/Artemis/Artemis/Utilities/Logging.cs b/Artemis/Artemis/Utilities/Logging.cs new file mode 100644 index 000000000..50b2a84b1 --- /dev/null +++ b/Artemis/Artemis/Utilities/Logging.cs @@ -0,0 +1,47 @@ +using NLog; +using NLog.Config; +using NLog.Targets; + +namespace Artemis.Utilities +{ + public static class Logging + { + public static void SetupLogging(string logLevel) + { + SetupLogging(LogLevel.FromString(logLevel)); + } + + public static void SetupLogging(LogLevel logLevel) + { + // Step 1. Create configuration object + var config = new LoggingConfiguration(); + + // Step 2. Create targets and add them to the configuration + var debuggerTarget = new DebuggerTarget(); + config.AddTarget("debugger", debuggerTarget); + + var fileTarget = new FileTarget(); + config.AddTarget("file", fileTarget); + + // Step 3. Set target properties + debuggerTarget.Layout = @"${logger:shortName=True} - ${uppercase:${level}}: ${message}"; + fileTarget.FileName = "${specialfolder:folder=MyDocuments}/Artemis/logs/${shortdate}.txt"; + fileTarget.Layout = "${longdate}|${level:uppercase=true}|${logger}|${message} ${exception:format=tostring}"; + fileTarget.ArchiveEvery = FileArchivePeriod.Day; + fileTarget.MaxArchiveFiles = 7; + + // Step 4. Define rules + var rule1 = new LoggingRule("*", logLevel, debuggerTarget); + config.LoggingRules.Add(rule1); + var rule2 = new LoggingRule("*", logLevel, fileTarget); + config.LoggingRules.Add(rule2); + + // Step 5. Activate the configuration + LogManager.Configuration = config; + + // Log as fatal so it always shows + var logger = LogManager.GetCurrentClassLogger(); + logger.Fatal("INFO: Set log level to {0}", logLevel); + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs b/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs index e4a5f8a85..2d927fde8 100644 --- a/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs +++ b/Artemis/Artemis/ViewModels/Flyouts/FlyoutSettingsViewModel.cs @@ -7,9 +7,7 @@ using Artemis.Settings; using Caliburn.Micro; using MahApps.Metro.Controls; using NLog; -using NLog.Targets; using ILogger = Ninject.Extensions.Logging.ILogger; -using LogManager = NLog.LogManager; namespace Artemis.ViewModels.Flyouts { @@ -31,9 +29,11 @@ namespace Artemis.ViewModels.Flyouts Position = Position.Right; GeneralSettings = new GeneralSettings(); + LogLevels = new BindableCollection(); + LogLevels.AddRange(LogLevel.AllLoggingLevels.Select(l => l.Name)); + PropertyChanged += KeyboardUpdater; events.Subscribe(this); - ApplyLogging(); } public MainManager MainManager { get; set; } @@ -71,8 +71,15 @@ namespace Artemis.ViewModels.Flyouts } } - public BindableCollection Themes - => new BindableCollection {"Light", "Dark", "Corsair Light", "Corsair Dark"}; + public BindableCollection Themes => new BindableCollection + { + "Light", + "Dark", + "Corsair Light", + "Corsair Dark" + }; + + public BindableCollection LogLevels { get; set; } public string SelectedTheme { @@ -85,6 +92,17 @@ namespace Artemis.ViewModels.Flyouts } } + public string SelectedLogLevel + { + get { return GeneralSettings.LogLevel; } + set + { + if (value == GeneralSettings.LogLevel) return; + GeneralSettings.LogLevel = value; + NotifyOfPropertyChange(() => SelectedLogLevel); + } + } + public string SelectedKeyboardProvider { get { return _selectedKeyboardProvider; } @@ -130,27 +148,6 @@ namespace Artemis.ViewModels.Flyouts NotifyOfPropertyChange(() => Enabled); } - // TODO https://github.com/ninject/Ninject.Extensions.Logging/issues/35 - private void ApplyLogging() - { - return; - var c = LogManager.Configuration; - var file = c.FindTargetByName("file") as FileTarget; - if (file == null) - return; - - var rule = c.LoggingRules.FirstOrDefault(r => r.Targets.Contains(file)); - if (rule == null) - return; - - if (EnableDebug) - rule.EnableLoggingForLevel(LogLevel.Debug); - rule.DisableLoggingForLevel(LogLevel.Debug); - - LogManager.ReconfigExistingLoggers(); - _logger.Info("Set debug logging to: {0}", EnableDebug); - } - /// /// Takes proper action when the selected keyboard is changed in the UI /// diff --git a/Artemis/Artemis/Views/Flyouts/FlyoutSettingsView.xaml b/Artemis/Artemis/Views/Flyouts/FlyoutSettingsView.xaml index bc86f9bf8..105fdbd39 100644 --- a/Artemis/Artemis/Views/Flyouts/FlyoutSettingsView.xaml +++ b/Artemis/Artemis/Views/Flyouts/FlyoutSettingsView.xaml @@ -4,12 +4,22 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls" - xmlns:cal="http://www.caliburnproject.org" + xmlns:cal="http://www.caliburnproject.org" + xmlns:utilities="clr-namespace:Artemis.Utilities" + xmlns:sys="clr-namespace:System;assembly=mscorlib" + xmlns:profileEnumerations="clr-namespace:Artemis.Models.Profiles" mc:Ignorable="d" d:DesignHeight="600" d:DesignWidth="300" Width="300"> - + + + + + + @@ -27,6 +37,7 @@ + @@ -86,16 +97,23 @@ VerticalAlignment="Center" HorizontalAlignment="Right" Width="125" IsChecked="{Binding Path=GeneralSettings.EnablePointersUpdate, Mode=TwoWay}" /> + +