Lager输出成html格式的日志

Lager是Erlang和Elixir的日志库,允许自定义输出格式,包括生成HTML格式的日志,便于异常调试。可通过MIX、REBAR或ERLANG.MK添加依赖。设置环境变量并配置后,日志将在log目录下以HTML形式生成。可通过扩展模块如lager_log_html_formatter和lager_log_html_rotator定制日志行为。

简介

lager是erlang和exlir的一个日志库,输出格式支持自定义,可以通过额外插件扩展将日志输出成html格式,这样异常日志从颜色上就可以明显的看出来,方便调试

使用

库已经上传了hex库,可以通过以下3种方式中任一使用

  • mix 中加入{:lager_html, "~> 0.0.1"}
  • rebar.config 的deps 中加入 {lager_html, "0.0.1"}
  • erlang.mk 中加入 dep_lager_html = hex 0.0.1

如果hex下载失败,按照rebar.config中的deps格式从github上直接下载
GitHub链接

配置了依赖后,需要修改一些环境变量配置
可以选择直接将以下内容加入到src/lager.app.src 的env字段中
也可以加入到自己项目的 env文件中

[
    {log_root, "./log"},
    {handlers, [
        {lager_file_backend,
            [
                %% 日志文件前缀,全名是 File++Date.html
                {file, "error_log"},
                %%debug=128, info=64, notice=32, warning=16, error=8, critical=4, alert=2, emergency=1, none=0
                {level, info},
                {formatter, lager_log_html_formatter},
                %% 字符串格式,可选值,使用lager_log_html_formatter后默认模板会改成以下内容
%%                    {formatter_config, ["<div><font size=\"2\" color=", html_color, ">\n== ", date, " ",
%%                        time, " ===", sev, "(", pid, module, ":", function, ":", line, ") : ", message, "\n</font></div>"]},
                %% 每天生成新日志文件,最多保留30个
                {date, "$D0"},
                {count, 30},
                {rotator, lager_log_html_rotator}
            ]}
    ]},
    %% error_logger重定向
    {error_logger_redirect, true},

    %% crash_log
    {crash_log, "crash.log"}, %% crash.log文件名
    {crash_log_count, 5},    %% 最多保存5个crash.log文件
    {crash_log_date, "$Ml"} %% 每月最后一天生成一个新的crash.log

    %% html染色,替换lager_log_html_formatter提供的模板中的html_color字段,可选值,默认值如下
    %% {html_colors, [
    %%     {error, "\"#FF0000\""},
    %%     {warning, "\"#FFCC33\""},
    %%     {debug, "\"#00FFD2\""},
    %%     {info, "\"#00FF00\""},
    %%     {critical, "\"#6C2A6D\""}]}

]

也可以选择在启动参数里加入 -config xx.config xx.config中的内容 {lager, KV}.
或者在rebar.config中加入get-deps的hook,在每次拉取下来的时候重新修改lager的 lager.app.src中的默认环境变量
不推荐在代码中调用application:set_env来实现,因为lager.app.src中会覆盖之前的内容,而且lager很多参数都是启动时生效,后续不能修改

测试

在rebar.config 的erl_opts 中加入{src_dirs, ["src", "test"]}编译
在项目目录下执行erl -pa ebin deps/lager/ebin deps/goldrush/ebin -config test/lager_html_test.config
执行 lager_html_test:test().
log目录下就会生成对应的日志文件

扩展

也可以仿照lager_log_html_formatter和lager_log_html_rotator写两个类似的模块放到自己的工程项目中,
项目本身并没有其他扩展

UATHelper: 打包 (Android (ASTC)): LogWindows: Error: appError called: Fatal error: [File:D:\build\++UE5\Sync\Engine\Source\Runtime\Engine\Private\ShaderCompiler\ShaderCompiler.cpp] [Line: 4668] UATHelper: 打包 (Android (ASTC)): /Engine/Private/LocalVertexFactoryCommon.ush:146:32: warning: conversion from larger type 'float4' to smaller type '__restrict min16float4', possible loss of data [-Wconversion] UATHelper: 打包 (Android (ASTC)): Interpolants.TangentToWorld0 = float4(InTangentToWorld0, 0); UATHelper: 打包 (Android (ASTC)): ^ UATHelper: 打包 (Android (ASTC)): /Engine/Private/LocalVertexFactoryCommon.ush:147:32: warning: conversion from larger type 'float4' to smaller type '__restrict min16float4', possible loss of data [-Wconversion] UATHelper: 打包 (Android (ASTC)): Interpolants.TangentToWorld2 = float4(InTangentToWorld2, InTangentToWorldSign); UATHelper: 打包 (Android (ASTC)): ^ UATHelper: 打包 (Android (ASTC)): /Engine/Private/LocalVertexFactory.ush:541:17: warning: conversion from larger type 'float3x3' to smaller type 'min16float3x3', possible loss of data [-Wconversion] UATHelper: 打包 (Android (ASTC)): min16float3x3 LocalToWorld = LWCToFloat3x3(GetInstanceData(Intermediates).LocalToWorld); UATHelper: 打包 (Android (ASTC)): ^ UATHelper: 打包 (Android (ASTC)): /Engine/Private/LocalVertexFactory.ush:542:15: warning: conversion from larger type 'float3' to smaller type 'min16float3', possible loss of data [-Wconversion] UATHelper: 打包 (Android (ASTC)): min16float3 InvScale = GetInstanceData(Intermediates).InvNonUniformScale; UATHelper: 打包 (Android (ASTC)): ^ UATHelper: 打包 (Android (ASTC)): /Engine/Private/LocalVertexFactory.ush:853:36: warning: conversion from larger type 'float' to smaller type 'min16float', possible loss of data [-Wconversion] UATHelper: 打包 (Android (ASTC)): Intermediates.TangentToWorldSign = TangentSign * GetInstanceData(Intermediates).DeterminantSign; UATH
最新发布
07-01
<think>我们正在处理一个关于使用UATHelper打包Android(ASTC)时遇到的着色器编译错误的问题。错误信息是:“ShaderCompiler errorFatalappErrorcalled FileShaderCompiler.cppLine4668conversion fromfloat4to min16float4 lossof data”。这个错误通常发生在着色器代码中尝试将高精度的float4类型转换为低精度的min16float4类型时,导致数据丢失。由于min16float4是半精度类型,而float4是全精度,这种转换可能是不安全的,因此编译器报错。###解决步骤1. **定位问题着色器**:-错误信息中提到了文件`ShaderCompiler.cpp`和行号4668,但这只是编译器内部的代码位置,并不是我们着色器代码的位置。我们需要查看完整的编译日志,找到是哪个着色器文件导致了这个问题。-在打包日志中搜索“error”或“Fatal appError”,通常会有更具体的着色器文件名和行号。2.**检查着色器代码**:-一旦确定了具体的着色器文件,打开该文件并查找从`float4`到`min16float4`的转换。这种转换可能出现在变量赋值或函数返回值中。-例如,可能有一段代码类似于:```hlslmin16float4 var= float4_value; //这里float4_value是float4类型``` 3. **修改着色器代码**:-如果确实需要半精度类型,可以尝试显式转换并确保转换是安全的。但是,如果数据范围超出了半精度能表示的范围,则不能直接转换。-解决方案一:避免使用`min16float4`,改用`float4`(如果性能允许)。-解决方案二:如果必须使用半精度,则确保赋值的数据在转换前已经处于半精度可表示的范围内。或者使用显式转换函数,例如`min16float4(value)`,但这仍然可能丢失精度。-解决方案三:检查是否真的需要将float4转换为min16float4。有时候可能是类型声明错误,可以修改为合适的类型。4.**使用类型转换函数**:-在HLSL中,可以使用内置的转换函数,例如:```hlslmin16float4 var= (min16float4)float4_value;```但这样仍然会丢失精度,所以需要谨慎。 5. **修改编译器设置**:-在项目的Shader编译设置中,可以尝试禁用精度转换相关的警告或错误。但是,这可能会导致运行时错误,因此不推荐。-另一种方法是,在Shader代码中使用`#pragma`指令来忽略特定的警告。例如,在着色器开头添加:```hlsl#pragmawarning(disable :3206) //禁用精度损失警告```但是,这可能会隐藏真正的问题。6.**检查引擎版本**:-如果使用的是Unreal Engine,检查是否有已知的引擎Bug。有时,升级引擎或应用补丁可以解决此类问题。 ###具体操作由于错误信息中提到了行号4668,这通常是UnrealEngine的Shader编译器内部代码。因此,我们需要在项目着色器中查找问题。例如,假设在着色器中发现了如下代码:```hlslmin16float4Color= CalculateFullPrecisionColor(); ```其中`CalculateFullPrecisionColor`返回`float4`。修改方法可以是: ```hlslfloat4 ColorFull =CalculateFullPrecisionColor();min16float4Color =ColorFull; //这样会触发警告,但可以尝试强制转换//或者min16float4Color =(min16float4)ColorFull; //显式转换```但更好的做法是,如果不需要半精度,则直接使用`float4`。###注意事项-在移动平台上,使用半精度可以提升性能,但需要注意精度范围。 -如果转换的值在[-65504,65504]范围内,半精度可以表示,否则会出现精度损失。 ###参考在UnrealEngine中,关于精度控制的文档可以参考:[Unreal EngineShaderDevelopment](https://docs.unrealengine.com/en-US/Programming/Rendering/ShaderDevelopment/index.html)[^1]§§相关问题§§1.如何查看UnrealEngine打包Android时的完整日志? 2.在HLSL中,float4和min16float4有什么区别?3.如何避免在着色器中因类型转换导致的数据丢失?4.在移动设备上使用半精度浮点数有哪些优缺点?</think>### 解决 UATHelper Android ASTC ShaderCompiler 错误 该错误发生在着色器编译阶段,核心问题是 **将高精度 `float4` 类型强制转换为低精度 `min16float4` 类型导致数据丢失**。以下是系统化的解决方案: #### 1. **定位问题着色器** - 在打包日志中搜索 `ShaderCompiler.cpp:4668` 附近的错误堆栈 - 查找类似报错: ``` error: implicit truncation from 'float4' to 'min16float4' loses precision ``` - 确定具体着色器文件(如 `*.usf` 或 `*.ush`) #### 2. **修改着色器代码** 在问题着色器中修改类型转换方式: ```hlsl // 错误写法(隐式转换) min16float4 color = float4Value; // 正确写法(显式转换+精度控制) min16float4 color = (min16float4)clamp(float4Value, 0.0, 1.0); ``` - 使用 `clamp` 确保值在半精度浮点范围(`-65504` ~ `+65504`) - 添加显式类型转换 `(min16float4)` #### 3. **调整引擎设置** 在 `DefaultEngine.ini` 中: ```ini [ShaderCompiler] bEnable16bitTypes=false ; 全局禁用min16类型 ``` 或针对 Android ASTC 覆盖设置: ```ini [Android_ASTC] r.HLSL.UseMiniMath=0 ; 禁用半精度优化 ``` #### 4. **验证修复** 重新打包时添加调试参数: ```bash UATHelper BuildCookRun -platform=Android_ASTC -CompileShaders -Verbose ``` 观察输出中是否包含: ``` ShaderCompiler: Compiled [YourShaderName] successfully ``` ### 技术原理 - **`min16float4` 限制**:半精度浮点(16bit)范围远小于全精度(32bit),直接转换会导致: - 大于 `65504` 的值变为 `INF` - 小于 `6.10×10⁻⁵` 的值丢失精度 - **ASTC 特殊性**:Android ASTC 纹理格式要求着色器使用特定精度规范[^1] ### 预防措施 1. 在着色器中添加精度检查: ```hlsl #ifndef min16float4 #error "min16float4 not supported on this platform" #endif ``` 2. 使用 UE 的精度宏: ```hlsl #include "/Engine/Public/Platform.ush" half4 color = TO_HALF4(float4Value); ``` > 通过显式转换和值域约束可解决 99% 的此类错误。若问题持续,检查自定义着色器插件是否覆盖了引擎默认精度设置[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值