public WorkerRole(Settings settings) { string logDir = Path.Combine(Environment.CurrentDirectory, "Logs"); try { // Configure NLog LoggingConfiguration config = new LoggingConfiguration(); // Console Target var consoleTarget = new SnazzyConsoleTarget(); config.AddTarget("console", consoleTarget); consoleTarget.Layout = "[${logger:shortName=true}] ${message}"; // Get the logs resource if it exists and use it as the log dir try { if (RoleEnvironment.IsAvailable) { LocalResource logsResource = RoleEnvironment.GetLocalResource("Logs"); logDir = logsResource.RootPath; } } catch (Exception) { // Just use basedir. } // File Target FileTarget jobLogTarget = new FileTarget() { FileName = Path.Combine(logDir, "Jobs", "${logger:shortName=true}.log.json"), ArchiveFileName = Path.Combine(logDir, "Jobs", "${logger:shortName=true}.${date:yyyy-MM-dd}.log") }; ConfigureFileTarget(jobLogTarget); config.AddTarget("file-job", jobLogTarget); FileTarget hostTarget = new FileTarget() { FileName = Path.Combine(logDir, "Host", "Host.log.json"), ArchiveFileName = Path.Combine(logDir, "Host", "Host.${date:yyyy-MM-dd}.log") }; ConfigureFileTarget(hostTarget); config.AddTarget("file-host", hostTarget); FileTarget globalTarget = new FileTarget() { FileName = Path.Combine(logDir, "Master", "Master.log.json") }; ConfigureFileTarget(globalTarget); globalTarget.MaxArchiveFiles = 1; globalTarget.ArchiveAboveSize = 1024 * 1024; globalTarget.EnableFileDelete = true; globalTarget.DeleteOldFileOnStartup = true; globalTarget.AutoFlush = true; config.AddTarget("file-master", globalTarget); TraceTarget traceTarget = new TraceTarget() { Layout = "[${logger:shortName=true}][${date:yyyy-MM-ddTHHmmss}]${message}" }; config.AddTarget("trace", traceTarget); LoggingRule allMessagesToConsole = new LoggingRule("*", NLog.LogLevel.Trace, consoleTarget); config.LoggingRules.Add(allMessagesToConsole); LoggingRule allMessagesToGlobal = new LoggingRule("*", NLog.LogLevel.Debug, globalTarget); config.LoggingRules.Add(allMessagesToGlobal); LoggingRule allMessagesToTrace = new LoggingRule("*", NLog.LogLevel.Debug, traceTarget); config.LoggingRules.Add(allMessagesToTrace); // All other rules transfer all kinds of log messages EXCEPT Trace. LoggingRule hostToFile = new LoggingRule("JobRunner", NLog.LogLevel.Debug, hostTarget); config.LoggingRules.Add(hostToFile); LoggingRule roleToFile = new LoggingRule("WorkerRole", NLog.LogLevel.Debug, hostTarget); config.LoggingRules.Add(roleToFile); LoggingRule jobLogs = new LoggingRule("Job.*", NLog.LogLevel.Debug, jobLogTarget); config.LoggingRules.Add(jobLogs); LogManager.Configuration = config; _logger = LogManager.GetLogger("WorkerRole"); } catch (Exception ex) { File.WriteAllText(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "FatalError.txt"), ex.ToString()); } _logger.Info("Logging Enabled to {0}", logDir); try { if (RoleEnvironment.IsAvailable) { ConfigureAzureDiagnostics(logDir); } else { _logger.Info("Skipping Azure Diagnostics, we aren't in Azure"); } } catch (Exception ex) { _logger.InfoException("Skipping Azure Diagnostics, we got an exception trying to check if we are in Azure", ex); } try { _runner = LoadJobRunner(settings); } catch (Exception ex) { _logger.ErrorException("Error loading Job Runner", ex); } }