using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
namespace SuperSocket.SocketBase.Logging
{
///
/// LogFactory Base class
///
public abstract class LogFactoryBase : ILogFactory
{
///
/// Gets the config file file path.
///
protected string ConfigFile { get; private set; }
///
/// Gets a value indicating whether the server instance is running in isolation mode and the multiple server instances share the same logging configuration.
///
protected bool IsSharedConfig { get; private set; }
///
/// Initializes a new instance of the class.
///
/// The config file.
protected LogFactoryBase(string configFile)
{
if (Path.IsPathRooted(configFile))
{
ConfigFile = configFile;
return;
}
if (Path.DirectorySeparatorChar != '\\')
{
configFile = Path.GetFileNameWithoutExtension(configFile) + ".unix" + Path.GetExtension(configFile);
}
var currentAppDomain = AppDomain.CurrentDomain;
var isolation = IsolationMode.None;
var isolationValue = currentAppDomain.GetData(typeof(IsolationMode).Name);
if (isolationValue != null)
isolation = (IsolationMode)isolationValue;
if (isolation == IsolationMode.None)
{
var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, configFile);
if (File.Exists(filePath))
{
ConfigFile = filePath;
return;
}
filePath = Path.Combine(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Config"), configFile);
if (File.Exists(filePath))
{
ConfigFile = filePath;
return;
}
ConfigFile = configFile;
return;
}
else //The running AppServer is in isolated appdomain
{
//1. search the appDomain's base directory
var filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, configFile);
if (File.Exists(filePath))
{
ConfigFile = filePath;
return;
}
//go to the application's root
//the appdomain's root is /WorkingDir/DomainName, so get parent path twice to reach the application root
var rootDir = Directory.GetParent(AppDomain.CurrentDomain.BaseDirectory).Parent.FullName;
//2. search the file with appdomain's name as prefix in the application's root
//the config file whose name have appDomain's name has higher priority
filePath = Path.Combine(rootDir, AppDomain.CurrentDomain.FriendlyName + "." + configFile);
if (File.Exists(filePath))
{
ConfigFile = filePath;
return;
}
//3. search in the application's root without appdomain's name as prefix
filePath = Path.Combine(rootDir, configFile);
if (File.Exists(filePath))
{
ConfigFile = filePath;
IsSharedConfig = true;
return;
}
rootDir = Path.Combine(rootDir, "Config");
//Search the config file with appdomain's name as prefix in the Config dir
filePath = Path.Combine(rootDir, AppDomain.CurrentDomain.FriendlyName + "." + configFile);
if (File.Exists(filePath))
{
ConfigFile = filePath;
return;
}
filePath = Path.Combine(rootDir, configFile);
if (File.Exists(filePath))
{
ConfigFile = filePath;
IsSharedConfig = true;
return;
}
ConfigFile = configFile;
return;
}
}
///
/// Gets the log by name.
///
/// The name.
///
public abstract ILog GetLog(string name);
}
}