Lately, i created something like this:
public static class Logger
{
private static bool isLoaded = false;
public static ILog Log
{
get
{
System.Reflection.MethodBase method;
method = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod();
StringBuilder loggerName = new StringBuilder();
loggerName.AppendFormat("{0}.{1}(", method.ReflectedType.FullName, method.Name);
ParameterInfo[] parameters = method.GetParameters();
string[] parametersStr = new string[parameters.Length];
if (parameters.Length > 0)
{
for (int i = 0; i < parameters.Length; i++)
{
parametersStr[i] = parameters[i].ToString();
}
loggerName.Append(String.Join(", ", parametersStr));
}
loggerName.Append(")");
return GetLogger(loggerName.ToString());
}
}
private static ILog GetLogger(string loggerName)
{
if (!isLoaded)
{
log4net.Config.XmlConfigurator.Configure();
}
return LogManager.GetLogger(loggerName);
}
}
it lets me use log4net without creating its instance in every class i need to use it, and i still get class name and method where i logged the action.
Sample usage:
Logger.Log.DebugFormat("Response [{0}]", xmlResponse);