【发布时间】:2019-08-03 07:00:01
【问题描述】:
我有一个带有 x86 构建平台的 .net core 2.2 控制台应用程序,它只调用一个非托管 dll,该 dll 返回结果的布尔值,并且该 dll 还在磁盘上写入一个名为“OMNISCHEDULERLIB.LOG”的 txt 文件,同时在本地调试我可以运行它并且函数正确执行并在控制台上打印出 dll 的结果布尔值。
class Program
{
static void Main(string[] args)
{
try
{
var result = ProcessJobs();
Console.WriteLine(result);
}
catch (Exception e)
{
Console.WriteLine(e.Message + e.StackTrace);
}
}
[DllImport("Output/OmniSchedulerLIB.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "ProcessJobs")]
private static extern bool ProcessJobs();
}
这是我的 Program.cs 文件的代码,它在本地正确调用 dll 并在文件夹输出中生成“OMNISCHEDULERLIB.LOG”。 当我将它部署为 azure 作为 AppService 的 WebJob 时,webjob 会在控制台上正确打印出结果,但在输出文件夹下没有创建日志文件(我已经通过 ftp 和 Kudu 工具进行了检查)。 我不明白的是,如果我继续使用 Kudu 工具和 webjob 目录并通过 cmd 'start myapp.exe' 运行控制台应用程序的 .exe,我会在控制台上得到结果并创建 .log 文件在我的网络作业的输出文件夹下。
我的问题是 azure webjob 运行什么命令来执行我的 .net 核心控制台,它是如何防止写入磁盘的,或者对这种情况有任何其他解释?
编辑:进入 D:\home\data\logs\ 后,我能够找到正在运行的脚本
[03/13/2019 10:05:00 > a87042: SYS INFO] Status changed to Initializing
[03/13/2019 10:05:05 > a87042: SYS INFO] Run script 'OmniManager.OmniSchedulerWebJob.exe' with script host - 'WindowsScriptHost'
[03/13/2019 10:05:05 > a87042: SYS INFO] Status changed to Running
[03/13/2019 10:05:10 > a87042: INFO] True
[03/13/2019 10:05:10 > a87042: SYS INFO] Status changed to Success
但是那里没有生成 .log 文件,但是如果我从 kudu 的 cmd 'start OmniManager.OmniSchedulerWebJob.exe' 手动运行命令,它将返回与上述相同的结果 'True' 但生成了 .log 文件.我尝试添加 run.cmd 来运行我的 dotnet 控制台应用程序 dll 但没有成功,但似乎我收到了一个错误,因为我无法从 x86 平台运行它,而且我还没有找到运行“dotnet”的方法选择 .net 的 x86 sdk 时执行命令,但我的 exe 将以 32 位执行。
【问题讨论】:
-
你能试着在这行之后写文件登录吗 var result = ProcessJobs();看看它是否有效并创建新文件?此外,您实际上可以在 KUDU 中看到相同的日志,您将能够看到它实际执行的命令和 exe。你能试试看它是否提供了一些有用的信息。
-
我已经根据您的 aswner 和 @joey-cai 的意见编辑了我的问题
-
请参考 Joey cai 发布的答案,看看是否有帮助。我的下一点是相同的使用路径 data\logs\OMNISCHEDULERLIB.log 而不是直接添加日志文件名输出。
-
问题是我正在调用一个没有源代码的dll,我也无法选择它默认写入的位置,它将写入输出文件夹,通过运行exe可以正确执行Kudu 上的 cmd 命令,但是当 webjob 按计划或手动运行时,它不会生成该文件
标签: c# azure .net-core azure-webjobs