예제 #1
0
        private Logger GetLogger(LoggerCacheKey cacheKey)
        {
            lock (this)
            {
                Logger l;

                if (_loggerCache.TryGetValue(cacheKey, out l))
                {
                    return(l);
                }

                //Activator.CreateInstance(cacheKey.ConcreteType);
                Logger newLogger;

                if (cacheKey.ConcreteType != null && cacheKey.ConcreteType != typeof(Logger))
                {
                    newLogger = (Logger)FactoryHelper.CreateInstance(cacheKey.ConcreteType);
                }
                else
                {
                    newLogger = new Logger();
                }

                if (cacheKey.ConcreteType != null)
                {
                    newLogger.Initialize(cacheKey.Name, GetConfigurationForLogger(cacheKey.Name, Configuration), this);
                }
                _loggerCache.Add(cacheKey, newLogger);
                return(newLogger);
            }
        }
예제 #2
0
        private static Logger CreateDefaultLogger(ref LoggerCacheKey cacheKey)
        {
            cacheKey = new LoggerCacheKey(cacheKey.Name, typeof(Logger));

            var newLogger = new Logger();

            return(newLogger);
        }
예제 #3
0
파일: LogFactory.cs 프로젝트: tr002196/NLog
        private Logger GetLogger(LoggerCacheKey cacheKey)
        {
            lock (this)
            {
                WeakReference l;

                if (this.loggerCache.TryGetValue(cacheKey, out l))
                {
                    Logger existingLogger = l.Target as Logger;
                    if (existingLogger != null)
                    {
                        // logger in the cache and still referenced
                        return(existingLogger);
                    }
                }

                Logger newLogger;

                if (cacheKey.ConcreteType != null && cacheKey.ConcreteType != typeof(Logger))
                {
                    try
                    {
                        newLogger = (Logger)FactoryHelper.CreateInstance(cacheKey.ConcreteType);
                    }
                    catch (Exception exception)
                    {
                        if (exception.MustBeRethrown())
                        {
                            throw;
                        }

                        if (ThrowExceptions)
                        {
                            throw;
                        }

                        InternalLogger.Error("Cannot create instance of specified type. Proceeding with default type instance. Exception : {0}", exception);

                        //Creating default instance of logger if instance of specified type cannot be created.
                        cacheKey = new LoggerCacheKey(typeof(Logger), cacheKey.Name);

                        newLogger = new Logger();
                    }
                }
                else
                {
                    newLogger = new Logger();
                }

                if (cacheKey.ConcreteType != null)
                {
                    newLogger.Initialize(cacheKey.Name, this.GetConfigurationForLogger(cacheKey.Name, this.Configuration), this);
                }

                this.loggerCache[cacheKey] = new WeakReference(newLogger);
                return(newLogger);
            }
        }
예제 #4
0
파일: LogFactory.cs 프로젝트: HUkiah/CLog
            public Logger Retrieve(LoggerCacheKey loggerCacheKey)
            {
                if (_loggerCache.TryGetValue(loggerCacheKey, out var loggerReference))
                {
                    return(loggerReference.Target as Logger);
                }

                return(null);
            }
예제 #5
0
            public Logger Retrieve(LoggerCacheKey cacheKey)
            {
                if (_loggerCache.TryGetValue(cacheKey, out var loggerReference))
                {
                    // logger in the cache and still referenced
                    return(loggerReference.Target as Logger);
                }

                return(null);
            }
예제 #6
0
            public override bool Equals(object o)
            {
                LoggerCacheKey lck2 = (LoggerCacheKey)o;

                if (lck2 == null)
                {
                    return(false);
                }

                return((ConcreteType == lck2.ConcreteType) && (lck2.Name == Name));
            }
예제 #7
0
파일: LogFactory.cs 프로젝트: vbfox/NLog
        private Logger GetLogger(LoggerCacheKey cacheKey)
        {
            lock (this.syncRoot)
            {
                Logger existingLogger = loggerCache.Retrieve(cacheKey);
                if (existingLogger != null)
                {
                    // Logger is still in cache and referenced.
                    return(existingLogger);
                }

                Logger newLogger;

                if (cacheKey.ConcreteType != null && cacheKey.ConcreteType != typeof(Logger))
                {
                    try
                    {
                        newLogger = (Logger)FactoryHelper.CreateInstance(cacheKey.ConcreteType);
                    }
                    catch (Exception ex)
                    {
                        if (ex.MustBeRethrown() || ThrowExceptions)
                        {
                            throw;
                        }

                        InternalLogger.Error("Cannot create instance of specified type. Proceeding with default type instance. Exception : {0}", ex);

                        // Creating default instance of logger if instance of specified type cannot be created.
                        cacheKey = new LoggerCacheKey(cacheKey.Name, typeof(Logger));

                        newLogger = new Logger();
                    }
                }
                else
                {
                    newLogger = new Logger();
                }

                if (cacheKey.ConcreteType != null)
                {
                    newLogger.Initialize(cacheKey.Name, this.GetConfigurationForLogger(cacheKey.Name, this.Configuration), this);
                }

                // TODO: Clarify what is the intention when cacheKey.ConcreteType = null.
                //      At the moment, a logger typeof(Logger) will be created but the ConcreteType
                //      will remain null and inserted into the cache.
                //      Should we set cacheKey.ConcreteType = typeof(Logger) for default loggers?

                loggerCache.InsertOrUpdate(cacheKey, newLogger);
                return(newLogger);
            }
        }
예제 #8
0
        private Logger GetLogger(LoggerCacheKey cacheKey)
        {
            lock (this)
            {
                WeakReference l;

                if (this.loggerCache.TryGetValue(cacheKey, out l))
                {
                    Logger existingLogger = l.Target as Logger;
                    if (existingLogger != null)
                    {
                        // logger in the cache and still referenced
                        return(existingLogger);
                    }
                }

                // Activator.CreateInstance(cacheKey.ConcreteType);
                Logger newLogger;

                if (cacheKey.ConcreteType != null && cacheKey.ConcreteType != typeof(Logger))
                {
                    newLogger = (Logger)FactoryHelper.CreateInstance(cacheKey.ConcreteType);
                }
                else
                {
                    newLogger = new Logger();
                }

                if (cacheKey.ConcreteType != null)
                {
                    newLogger.Initialize(cacheKey.Name, this.GetConfigurationForLogger(cacheKey.Name, this.Configuration), this);
                }

                this.loggerCache[cacheKey] = new WeakReference(newLogger);
                return(newLogger);
            }
        }
예제 #9
0
        private Logger GetLogger(LoggerCacheKey cacheKey)
        {
            lock(this)
            {
				Logger l;

				if(_loggerCache.TryGetValue(cacheKey, out l))
					return l;

                //Activator.CreateInstance(cacheKey.ConcreteType);
                Logger newLogger;

                if (cacheKey.ConcreteType != null && cacheKey.ConcreteType != typeof(Logger))
                    newLogger = (Logger)FactoryHelper.CreateInstance(cacheKey.ConcreteType);
                else
                    newLogger = new Logger();

                if (cacheKey.ConcreteType != null)
                    
                newLogger.Initialize(cacheKey.Name, GetConfigurationForLogger(cacheKey.Name, Configuration), this);
                _loggerCache.Add(cacheKey, newLogger);
                return newLogger;
            }
        }
예제 #10
0
        private Logger GetLogger(LoggerCacheKey cacheKey)
        {
            lock (this)
            {
                WeakReference l;

                if (this.loggerCache.TryGetValue(cacheKey, out l))
                {
                    Logger existingLogger = l.Target as Logger;
                    if (existingLogger != null)
                    {
                        // logger in the cache and still referenced
                        return existingLogger;
                    }
                }

                Logger newLogger;

                if (cacheKey.ConcreteType != null && cacheKey.ConcreteType != typeof(Logger))
                {
                    
                    try
                    {
                        newLogger = (Logger)FactoryHelper.CreateInstance(cacheKey.ConcreteType);
                    }
                    catch(Exception exception)
                    {
                        if(exception.MustBeRethrown())
                        {
                            throw;
                        }
                        
                        if(ThrowExceptions)
                        {
                            throw;
                        }
                        
                        InternalLogger.Error("Cannot create instance of specified type. Proceeding with default type instance. Exception : {0}",exception);
                        
                        //Creating default instance of logger if instance of specified type cannot be created.
                        cacheKey = new LoggerCacheKey(typeof(Logger),cacheKey.Name);
                        
                        newLogger = new Logger();
                    }
                    
                }
                else
                {
                    newLogger = new Logger();
                }

                if (cacheKey.ConcreteType != null)
                {
                    newLogger.Initialize(cacheKey.Name, this.GetConfigurationForLogger(cacheKey.Name, this.Configuration), this);
                }

                this.loggerCache[cacheKey] = new WeakReference(newLogger);
                return newLogger;
            }
        }
예제 #11
0
        private Logger GetLogger(LoggerCacheKey cacheKey)
        {
            lock (this.syncRoot)
            {
                Logger existingLogger = loggerCache.Retrieve(cacheKey);
                if (existingLogger != null)
                {
                    // Logger is still in cache and referenced.
                    return(existingLogger);
                }

                Logger newLogger;

                if (cacheKey.ConcreteType != null && cacheKey.ConcreteType != typeof(Logger))
                {
                    var fullName = cacheKey.ConcreteType.FullName;
                    try
                    {
                        //creating instance of static class isn't possible, and also not wanted (it cannot inherited from Logger)
                        if (cacheKey.ConcreteType.IsStaticClass())
                        {
                            var errorMessage = string.Format("GetLogger / GetCurrentClassLogger is '{0}' as loggerType can be a static class and should inherit from Logger",
                                                             fullName);
                            InternalLogger.Error(errorMessage);
                            if (ThrowExceptions)
                            {
                                throw new NLogRuntimeException(errorMessage);
                            }
                            newLogger = CreateDefaultLogger(ref cacheKey);
                        }
                        else
                        {
                            var instance = FactoryHelper.CreateInstance(cacheKey.ConcreteType);
                            newLogger = instance as Logger;
                            if (newLogger == null)
                            {
                                //well, it's not a Logger, and we should return a Logger.

                                var errorMessage = string.Format("GetLogger / GetCurrentClassLogger got '{0}' as loggerType which doesn't inherit from Logger", fullName);
                                InternalLogger.Error(errorMessage);
                                if (ThrowExceptions)
                                {
                                    throw new NLogRuntimeException(errorMessage);
                                }

                                // Creating default instance of logger if instance of specified type cannot be created.
                                newLogger = CreateDefaultLogger(ref cacheKey);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        InternalLogger.Error(ex, "GetLogger / GetCurrentClassLogger. Cannot create instance of type '{0}'. It should have an default contructor. ", fullName);

                        if (ex.MustBeRethrown())
                        {
                            throw;
                        }

                        // Creating default instance of logger if instance of specified type cannot be created.
                        newLogger = CreateDefaultLogger(ref cacheKey);
                    }
                }
                else
                {
                    newLogger = new Logger();
                }

                if (cacheKey.ConcreteType != null)
                {
                    newLogger.Initialize(cacheKey.Name, this.GetConfigurationForLogger(cacheKey.Name, this.Configuration), this, this.Configuration);
                }

                // TODO: Clarify what is the intention when cacheKey.ConcreteType = null.
                //      At the moment, a logger typeof(Logger) will be created but the ConcreteType
                //      will remain null and inserted into the cache.
                //      Should we set cacheKey.ConcreteType = typeof(Logger) for default loggers?

                loggerCache.InsertOrUpdate(cacheKey, newLogger);
                return(newLogger);
            }
        }
예제 #12
0
 /// <summary>
 /// Inserts or updates.
 /// </summary>
 /// <param name="cacheKey"></param>
 /// <param name="logger"></param>
 public void InsertOrUpdate(LoggerCacheKey cacheKey, Logger logger)
 {
     loggerCache[cacheKey] = new WeakReference(logger);
 }
예제 #13
0
        private Logger GetLogger(LoggerCacheKey cacheKey)
        {
            lock (this)
            {
                WeakReference l;

                if (this.loggerCache.TryGetValue(cacheKey, out l))
                {
                    Logger existingLogger = l.Target as Logger;
                    if (existingLogger != null)
                    {
                        // logger in the cache and still referenced
                        return existingLogger;
                    }
                }

                Logger newLogger;

                if (cacheKey.ConcreteType != null && cacheKey.ConcreteType != typeof(Logger))
                {
                    newLogger = (Logger)FactoryHelper.CreateInstance(cacheKey.ConcreteType);
                }
                else
                {
                    newLogger = new Logger();
                }

                if (cacheKey.ConcreteType != null)
                {
                    newLogger.Initialize(cacheKey.Name, this.GetConfigurationForLogger(cacheKey.Name, this.Configuration), this);
                }

                this.loggerCache[cacheKey] = new WeakReference(newLogger);
                return newLogger;
            }
        }
예제 #14
0
파일: LogFactory.cs 프로젝트: HUkiah/CLog
        private Logger GetLogger(LoggerCacheKey cacheKey)
        {
            lock (_syncRoot)
            {
                Logger existingLogger = _loggerCache.Retrieve(cacheKey);
                if (existingLogger != null)
                {
                    return(existingLogger);
                }

                Logger newLogger;

                //构建Logger对象
                if (cacheKey.ConcreteType != null && cacheKey.ConcreteType != typeof(Logger))
                {
                    var fullName = cacheKey.ConcreteType.FullName;
                    try
                    {
                        if (cacheKey.ConcreteType.IsStaticClass())
                        {
                            var errorMessage =
                                $"创建一个静态类 '{fullName}' 的实例是不可能的,它也不应该继承Logger ";
                            if (ThrowExceptions)
                            {
                                throw new CLogRuntimeException(errorMessage);
                            }
                            newLogger = CreateDefaultLogger(ref cacheKey);
                        }
                        else
                        {
                            var instance = FactoryHelper.CreateInstance(cacheKey.ConcreteType);
                            newLogger = instance as Logger;
                            if (newLogger == null)
                            {
                                var errorMessage =
                                    $"不能创建类型为'{fullName}'的实例。它应该有一个默认的构造函数。";
                                if (ThrowExceptions)
                                {
                                    throw new CLogRuntimeException(errorMessage);
                                }
                                //如果无法创建指定类型的实例,则创建logger的默认实例。
                                newLogger = CreateDefaultLogger(ref cacheKey);
                            }
                        }
                    } catch (Exception ex)
                    {
                        if (ex.MustBeRethrown())
                        {
                            throw;
                        }

                        //如果无法创建指定类型的实例,则创建logger的默认实例。
                        newLogger = CreateDefaultLogger(ref cacheKey);
                    }
                }
                else
                {
                    newLogger = new Logger();
                }

                if (cacheKey.ConcreteType != null)
                {
                    newLogger.Initialize(cacheKey.Name, GetConfigurationForLogger(cacheKey.Name, Configuration), this);
                }
                return(newLogger);
            }
        }
예제 #15
0
        private Logger GetLogger(LoggerCacheKey cacheKey)
        {
            lock (this)
            {
                Logger l;

                if (this.loggerCache.TryGetValue(cacheKey, out l))
                {
                    return l;
                }

                // Activator.CreateInstance(cacheKey.ConcreteType);
                Logger newLogger;

                if (cacheKey.ConcreteType != null && cacheKey.ConcreteType != typeof(Logger))
                {
                    newLogger = (Logger)FactoryHelper.CreateInstance(cacheKey.ConcreteType);
                }
                else
                {
                    newLogger = new Logger();
                }

                if (cacheKey.ConcreteType != null)
                {
                    newLogger.Initialize(cacheKey.Name, this.GetConfigurationForLogger(cacheKey.Name, this.Configuration), this);
                }

                this.loggerCache[cacheKey] = newLogger;
                return newLogger;
            }
        }