Files
duplicati/Duplicati/Library/Logging/LogEntry.cs
T
Kenneth Skovhede 842fd96543 Implemented a new logging system that is more transparent and allows a more granular way of picking log messages.
Added ID's to each log message and each exception to allow later introduction of a Knowledgebase service that explains each error in more detail.
2018-03-15 09:12:34 +01:00

175 lines
5.9 KiB
C#

// Copyright (C) 2018, The Duplicati Team
// http://www.duplicati.com, info@duplicati.com
//
// This library is free software; you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as
// published by the Free Software Foundation; either version 2.1 of the
// License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
using System;
using System.Collections.Generic;
using System.Linq;
namespace Duplicati.Library.Logging
{
/// <summary>
/// Instance of a log entry
/// </summary>
public class LogEntry
{
/// <summary>
/// The time when the entry was logged
/// </summary>
public DateTime When;
/// <summary>
/// The message that was logged
/// </summary>
public readonly string Message;
/// <summary>
/// The string format arguments, if any
/// </summary>
public readonly object[] Arguments;
/// <summary>
/// The message level
/// </summary>
public LogMessageType Level;
/// <summary>
/// The tag for the message
/// </summary>
public readonly string Tag;
/// <summary>
/// The message help-id
/// </summary>
public readonly string Id;
/// <summary>
/// An optional exception
/// </summary>
public readonly Exception Exception;
/// <summary>
/// The log context data, if any
/// </summary>
private Dictionary<string, string> m_logContext;
/// <summary>
/// Gets or sets the <see cref="T:Duplicati.Library.Logging.LogEntry"/> with the specified value.
/// </summary>
/// <param name="value">The key to use.</param>
public string this[string key]
{
get
{
if (m_logContext == null)
return null;
m_logContext.TryGetValue(key, out var s);
return s;
}
set
{
if (m_logContext == null)
m_logContext = new Dictionary<string, string>();
m_logContext[key] = value;
}
}
/// <summary>
/// Gets the keys in this log context
/// </summary>
/// <value>The context keys.</value>
public IEnumerable<string> ContextKeys
{
get
{
if (m_logContext == null)
return new string[0];
return m_logContext.Keys;
}
}
/// <summary>
/// Gets the message, formatted with arguments
/// </summary>
/// <value>The formatted message.</value>
public string FormattedMessage
{
get
{
if (Arguments == null || Arguments.Length == 0)
return Message;
try
{
return string.Format(Message, Arguments);
}
catch
{
// Try no to crash ...
return string.Format("Error while formating: \"{0}\" with arguments: [{1}]", Message, string.Join(", ", Arguments.Select(x => x == null ? "(null)" : x.ToString())));
}
}
}
/// <summary>
/// Initializes a new instance of the <see cref="T:Duplicati.Library.Logging.LogEntry"/> class.
/// </summary>
/// <param name="message">The message to use.</param>
/// <param name="arguments">An optional set of arguments.</param>
/// <param name="level">The log level.</param>
/// <param name="tag">The tag to use.</param>
/// <param name="id">The message ID.</param>
/// <param name="exception">An optional exception.</param>
public LogEntry(string message, object[] arguments, LogMessageType level, string tag, string id, Exception exception)
{
When = DateTime.Now;
Message = message;
Arguments = arguments;
Level = level;
Tag = tag;
Id = id;
Exception = exception;
}
/// <summary>
/// Returns a <see cref="T:System.String"/> that represents the current <see cref="T:Duplicati.Library.Logging.LogEntry"/>.
/// </summary>
/// <returns>A <see cref="T:System.String"/> that represents the current <see cref="T:Duplicati.Library.Logging.LogEntry"/>.</returns>
public override string ToString()
{
return string.Format("{0:yyyy-MM-dd HH:mm:ss zz} - [{1}]: {2}", When.ToLocalTime(), Tag, FormattedMessage);
}
/// <summary>
/// Returns the item as a string optionally with exception details
/// </summary>
/// <returns>A <see cref="T:System.String"/> that represents the current <see cref="T:Duplicati.Library.Logging.LogEntry"/>.</returns>
/// <param name="withExceptionDetails">If set to <c>true</c> the result has expanded exception details.</param>
public string AsString(bool withExceptionDetails)
{
return this.ToString() +
((withExceptionDetails && Exception != null)
? Environment.NewLine + Exception.ToString()
: string.Empty);
}
}
}