Как включить регистрацию в NVelocity? - PullRequest
1 голос
/ 01 сентября 2011

Есть идеи, как сделать то, что написано в названии? Единственное, что я нашел, было на оригинальном сайте Velocity, и я не думаю, что

ve.setProperty( RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
    "org.apache.velocity.runtime.log.Log4JLogChute" );

ve.setProperty("runtime.log.logsystem.log4j.logger",
   LOGGER_NAME);

будет прекрасно работать в .NET. Я использую log4net, который должен сделать это довольно легко, но документация по NVelocity действительно беспорядок.

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

Обновление:

В настоящее время NVelocity не поддерживает ведение журнала. Методы initializeLogger () и Log () в классе RuntimeInstance закомментированы.

Если вам нужно войти, раскомментируйте два метода, добавьте private ILogSystem logSystem; свойство

Вот наша реализация на лету:

public class RuntimeInstance : IRuntimeServices
{
    private ILogSystem logSystem;
    ...
    ...
    private void initializeLogger()
    {
    logSystem = LogManager.CreateLogSystem(this);

    }
    ...
    ...
    private void Log(LogLevel level, Object message)
    {
    String output = message.ToString();

    logSystem.LogVelocityMessage(level, output);
    }
    ...
}

Затем мы внедрили ILogSystem для log4net

using log4net;
using NVelocity.Runtime;
using NVelocity.Runtime.Log;

namespace Services.Templates
{
    public class Log4NetILogSystem : ILogSystem
    {
        private readonly ILog _log;

        public Log4NetILogSystem(ILog log )
        {
            _log = log;
        }

        public void Init(IRuntimeServices rs)
        {

        }

        public void LogVelocityMessage(LogLevel level, string message)
        {
            switch (level)
            {
                case LogLevel.Debug:
                    _log.Debug(message);
                    break;
                case LogLevel.Info:
                    _log.Info(message);
                    break;
                case LogLevel.Warn:
                    _log.Warn(message);
                    break;
                case LogLevel.Error:
                    _log.Error(message);
                    break;
            }
        }
    }
}

Затем при создании движка:

var engine = new VelocityEngine();
var props = new ExtendedProperties();    
props.SetProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM,
new Log4NetILogSystem(LogManager.GetLogger(typeof(NVelocityEngine))));
engine.Init(props);
1 голос
/ 01 сентября 2011

Реализация NVelocity.Runtime.Log.ILogSystem (вы можете написать простую реализацию, которая соединяется с log4net) и установить этот тип impl в свойстве RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS

Как я получил эту информацию:

  1. Получить код .
  2. Поиск "log" в кодовой базе
  3. Откройте для себя классы в NVelocity.Runtime.Log .
  4. Прочитайте источник этих классов, они очень просты и тщательно документированы.
...