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}" />
+
+
+
+
-
-
-
+