【问题标题】:Append to an online text log file from my offline C# app从我的离线 C# 应用程序附加到在线文本日志文件
【发布时间】:2013-02-09 21:15:05
【问题描述】:

我正在寻找有关我的一个或多个应用程序的客户反馈(可选,他们会收到通知),因此我想发送一些文本以从我的离线 C# Winforms 应用程序附加到在线日志文件.

如果有什么不同,服务器是基于 Linux 的,我不介意公众是否也可以访问它,所以无需担心加密或任何事情(没有个人详细信息或类似的东西会存储在他们)。

做这样的事情需要什么 C# 代码? (假装网站是:http://www.website.com/logfile.txt)。我是否必须批量读取文件,然后批量写回,还是可以使用更有效的“附加”操作?

编辑:看起来比我想象的要难。如果我必须制作一个简单的 PHP 脚本来帮助完成这项任务,那就这样吧,不过如果是这样的话,我也会感谢它的代码。

【问题讨论】:

    标签: c# logging text append


    【解决方案1】:

    这可能不足以满足您的需求,但这是我的解决方案。 我能想到的最简单的方法是让您的 C# 应用程序将文本发送到 Web 脚本。既然您说您不在乎数据是否已加密,我想为什么不将文本作为 get 参数传递给 PHP 脚本。 这个例子非常简单;您可能需要添加其他检查以满足您的需求:

    C# 代码如下所示:

     string loggerUrl = "http://www.YourDomainExample.com/Logger.php?text=";
     string textToLog = WebUtility.UrlEncode("This text came from my C# desktop application");
     HttpWebRequest myWebRequest = (HttpWebRequest)HttpWebRequest.Create(loggerUrl + textToLog);
     HttpWebResponse myWebResponse = (HttpWebResponse)myWebRequest.GetResponse();
     myWebResponse.Close();
    

    驻留在您的网络服务器上的 PHP 脚本如下所示:

    <?php
    
    $text = htmlspecialchars($_GET["text"]);
    
    $log = "log.txt";
    $fh = fopen($log, 'a') or die("can't open file"); // Open log in append mode
    $textToWrite = "$text\n"; //Write each comment on a line
    fwrite($fh, $textToWrite);
    fclose($fh);
    
    ?>
    

    通过这种方式,基本上任何可以调用 url 的东西都可以将文本附加到您的日志中。因此,您的记录器可以是桌面应用程序的一部分,可以在手机或 Web 应用程序等上运行。

    要测试您的 PHP 脚本是否正常工作,您可以将 Web 浏览器用作客户端,然后转到 http://www.YourDomainExample.com/Logger.php?text=Test from webbrowser 并检查您的 Web 服务器上的 log.txt

    【讨论】:

    • 这看起来很有希望!...但我无法解析“WebUtility”,因为我需要使用 .NET 3.5。也许我们可以用另一种方法来代替那个位?
    • 啊哈!我发现 System.Uri.EscapeDataString(textToLog) 而不是 WebUtility.UrlEncode(textToLog) 可以使用 .NET 3.5。我还删除了 PHP 文件那一行中的 htmlspecialchars() 位,只生成了 $text = $_GET["text"];,因为我开始得到像“&”这样的东西和“”在日志文件中。最后,我将输入中的所有\ns 都替换为句号(句点),这样它们就会全部进入一行。非常感谢,它很管用!
    【解决方案2】:

    如果您想登录远程目的地,我看到了两种解决方案。两者都在使用log4net

    解决方案 1:

    您可以设置log4net 来登录数据库。你可以看到here的配置。

    解决方案 2:

    您可以从 AppenderSkeleton 派生您的日志记录类,并配置行为以登录您想要的任何内容。

    internal class MyAppender : AppenderSkeleton
    {
        /// <summary>
        /// Subclasses of <see cref="T:log4net.Appender.AppenderSkeleton"/> should implement this method
        /// to perform actual logging.
        /// </summary>
        /// <param name="loggingEvent">The event to append.</param>
        protected override void Append(LoggingEvent loggingEvent)
        {
            /* Here you can do whatever you want with your loggingEvent */
        }
    }
    

    【讨论】:

    • 也谢谢,但我只需要一个纯文本文件(可能是 CSV)。 MySQL 等正在增加一层额外的复杂性,我目前可能不需要这样做。如果你有时间,而且很简单,也许你可以填写解决方案 2,因为我在这方面的知识很少(虽然没有压力)。
    【解决方案3】:

    你有几个选择。

    首先,您可以查看像loggly 这样的服务,它是一个在线日志文件。您将拥有一个个人 API 密钥来从您的应用程序中发布数据。

    如果您不想这样做,您可以编写自己的 API,其中包含一个带有字符串参数的简单 Post。然后它将负责打开文件、添加文本并保存它。 Winform 知道 API 可以处理它,就可以触发并忘记它。

    在 C# 中,您可以使用 RestSharp 或 HttpClient 将数据发送到 API。

    我认为您将遇到的问题是让 Winform 应用程序保存文件。如果它是本地文件,您可以只附加到文件(无需将整个文件读入内存。)但在远程计算机上,您首先必须下载整个文件。下一个问题是确保 Winform 应用程序可以保存文件。如果没有 API 调用之类的东西,您可能会遇到很多问题。

    【讨论】:

    • +1。此外,正如您暗示附加到文件可能会很痛苦,生成新的随机文件名并上传(即通过 FTP)可能更容易。或者如果需要单个文件,服务器端的 HTPP 端点(POST 接受文件)可以使并发更新问题更容易。
    • 谢谢,但对于如此通用且明显有用的东西,我很惊讶它竟然如此棘手。 Loggly 每月 149 美元,这至少超出了我的预算几个数量级。
    • 还有其他的,价格取决于您每天需要的空间量以及您想保留多长时间。例如,当我们将它用于异常记录时,它是免费的,因为我们每天需要的流量不到 200mb,而且需要不到一周的时间。
    • 你是对的 - Loggly 比我想象的要便宜得多,因为我会选择每天最小 200mb 的选项。但我宁愿数据无限期地保留在那里,而不是每周甚至每月都被擦除。 (虽然看得更远,它可以将它们存档到 Amazon S3 - 嗯.. 似乎有点啰嗦......)
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 2014-07-07
    • 1970-01-01
    相关资源
    最近更新 更多