我正在研究需要进行日志记录的Ruby库.理想情况下,我希望多个工作进程能够登录到同一个文件.Logger从Ruby的标准库查看该类的源代码,我看到我们正在努力将写入从多个线程同步到日志中(正如在Ruby的stdlib Logger类线程安全的答案中所指出的那样).
当多个进程写入同一个日志文件时似乎存在类似的问题:取决于底层如何决定缓冲/拆分写入,每个日志消息可能无法保持其完整性.
那么,是否有一种方法可以使用标准Logger类来允许多个进程安全地登录到单个文件?如果没有,这通常如何在Ruby项目中完成?
这就是'安全'的意思:
[1/1/2013 00:00:00] (PID N) LOGMESS[1/1/2013 00:00:01] (PID M) LOGMESSAGE2\nAGE1更新:
我决定接受Tin Man的建议并编写测试,你可以在这里找到:https: //gist.github.com/4370423
简短版本:Winfield是正确的,至少在默认情况下使用Logger它可以安全地同时使用多个进程(对于上面给出的'safe'的定义).
关键因素似乎是如果给定一个文件路径(而不是已经打开的IO对象),Logger将以模式打开文件WRONLY|APPEND,并sync=true在其上设置.这两件事的组合(至少在我对Mac OS X的测试中)似乎可以安全地从多个进程同时记录.如果要传入已打开的IO对象,请确保以相同的方式创建它.
MySQL手册(http://dev.mysql.com/doc/refman/5.1/en/charset-syntax.html)说:
字符集和排序规则的默认设置分为四个级别:服务器,数据库,表和列.以下部分中的描述可能看起来很复杂,但实践中发现多级默认会导致自然而明显的结果.
我想查询一个特定的CHAR/VARCHAR/TEXT列,找出MySQL认为的编码方式.是否有捷径可寻?我知道我可以SHOW CREATE TABLE <table>用来查看表的默认字符集,但是我想在列级别上做同样的事情,因为文档表明它可能与表默认值不同.
我有一个Backbone模型,它带有一个自定义验证方法,可以验证模型属性之一的格式.我的模型连接到一个通过文本字段公开所述属性的视图.视图有一个"保存"按钮,用户必须明确按此按钮才能将模型更改保存回服务器.
当用户键入无效的属性值时,我想在视觉上将该字段标记为处于无效状态.到目前为止,简单 - 我可以将输入字段的change事件绑定到一个函数,该函数调用myModel.set({ attribute: value })并监听"error"模型上的事件以告知验证何时失败,我应该将输入标记为无效.
当我想要处理单击保存按钮时出现问题.因为Backbone.Model.set如果验证失败,中止实际上在模型上设置属性,我的模型将不会准确反映用户输入的值,除非该值有效.当用户在键入无效值后单击"保存"时,我会检查模型是否有效,发现它是否(因为实际上从未设置过无效属性),并将旧的(有效)属性值保存到服务器.
我想要的是一个版本,set它始终发出请求的更改,但仍然会触发验证和事件.set(..., { silent: true })将允许更改通过,但不会运行验证或触发事件.
简而言之 - 我希望我的模型有时存在于无效状态(如果用户输入了无效的属性值),并且我希望能够在有效和无效之间转换时获取事件.是否有一种优雅的方式与骨干做这件事,或者我是否认为这完全错了?