我正在使用Sitecore 6.5。有一种多语言配置。我使用带别名的项目。
可以在内容项上创建别名。点击商品>演示>别名。 输入例如:/ page / stackoverflow / myitem。单击“确定”。
别名现在在内容树中创建,请参阅: / sitecore / system / Aliases / *
别名存储在内容树中:
- page
-- stackoverflow
--- myitem
每个项目都是创建的别名的一部分。
问题。
无效的网址(基于创建的别名)会导致错误日志中出现错误。 51161 12:01:26错误存在“/ page”的别名,但指向不存在的项目。
我想改变:
INFO/WARN
或httpRequest
管道以避免此错误。以上列表是首选订单。除非有更好的可能性来解决这个问题。是否有人遇到过这个问题并且有一个很好的解决方案?
非常感谢。
的Jordy
答案 0 :(得分:4)
Maras是现货,但你应该能够在没有HttpProcessor的情况下实现这一点,只需“稍微”使用web.config中的log4net设置。遗憾的是,我没有时间为你完全测试这个答案,但我会指出你认为你应该看的方向。
在web.config中找到<log4net>
部分。它定义了一系列“appender”,每个“appender”负责在Sitecore解决方案中创建不同的日志文件。它们看起来像这样:
<appender name="LogFileAppender" type="log4net.Appender.SitecoreLogFileAppender, Sitecore.Logging">
<file value="$(dataFolder)/logs/log.{date}.txt" />
<appendToFile value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%4t %d{ABSOLUTE} %-5p %m%n" />
</layout>
</appender>
您可以创建自己的appender;例如“AliasLogFileAppender”并将其内容记录为类似<file value="$(dataFolder)/logs/Aliaslog.{date}.txt" />
的内容。
一旦定义了,您需要做的就是将它连接到httpRequestPipeline中Sitecore自己的Alias Resolver的命名空间。查看appenders下方的<logger>
定义。它们看起来像这样:
<logger name="Sitecore.Diagnostics.WebDAV" additivity="false">
<level value="INFO" />
<appender-ref ref="WebDAVLogFileAppender" />
</logger>
“name”属性实际上表示命名空间,它将触发记录器。
所以你的配置应该是这样的:
<logger name="Sitecore.Pipelines.HttpRequest.AliasResolver" additivity="false">
<level value="INFO" />
<appender-ref ref="AliasLogFileAppender" />
</logger>
再次,对于在发布之前无法对此进行测试表示歉意。我不明白为什么它不起作用。
我相信在log4net中有一种方法可以将某个错误消息从WARN重新映射到INFO。然而,细节在这一刻逃过了我。
答案 1 :(得分:2)
如果您想要更改为日志级别(这是最优选的选项),您需要使用 Sitecore 中的原始AliasResolver
代码创建自己的AliasResolver
课程,更改日志记录级别并将其注册在 Sitecore配置而不是原始AliasResolver
中:
<httpRequestBegin>
...
<processor type="My.Assembly.Namespace.AliasResolver, My.Assembly" />
...
</httpRequestBegin>
using Sitecore;
using Sitecore.Configuration;
using Sitecore.Data;
using Sitecore.Data.Items;
using Sitecore.Diagnostics;
namespace My.Assembly.Namespace
{
public class AliasResolver : HttpRequestProcessor
{
public override void Process(HttpRequestArgs args)
{
Assert.ArgumentNotNull((object) args, "args");
if (!Settings.AliasesActive)
{
Tracer.Warning((object) "Aliases are not active.");
}
else
{
Database database = Context.Database;
if (database == null)
{
Tracer.Warning((object) "There is no context database in AliasResover.");
}
else
{
Profiler.StartOperation("Resolve alias.");
if (database.Aliases.Exists(args.LocalPath) && !this.ProcessItem(args))
this.ProcessExternalUrl(args);
Profiler.EndOperation();
}
}
}
private void ProcessExternalUrl(HttpRequestArgs args)
{
string targetUrl = Context.Database.Aliases.GetTargetUrl(args.LocalPath);
if (targetUrl.Length <= 0)
return;
this.ProcessExternalUrl(targetUrl);
}
private void ProcessExternalUrl(string path)
{
if (Context.Page.FilePath.Length > 0)
return;
Context.Page.FilePath = path;
}
private bool ProcessItem(HttpRequestArgs args)
{
ID targetId = Context.Database.Aliases.GetTargetID(args.LocalPath);
if (!targetId.IsNull)
{
Item target = args.GetItem(targetId);
if (target != null)
this.ProcessItem(args, target);
return true;
}
else
{
Tracer.Info((object) ("An alias for \"" + args.LocalPath + "\" exists, but points to a non-existing item."));
return false;
}
}
private void ProcessItem(HttpRequestArgs args, Item target)
{
if (Context.Item != null)
return;
Context.Item = target;
Tracer.Info((object) ("Using alias for \"" + (object) args.LocalPath + "\" which points to \"" + (string) (object) target.ID + "\""));
}
}
}