Clojure程序突发invokeWithEnv NIYWARNING未知警告,求解决方案
排查"invokeWithEnv NIYWARNING:"重复输出的实用方案
定位输出来源
- 用macOS自带的
dtruss跟踪程序系统调用,明确这些警告是从AppleScript桥接层、PostgreSQL驱动还是JNI模块发出的——这类无文档警告通常来自底层非Java代码的隐性日志。 - 梳理Clojure依赖树,检查
korma关联的PostgreSQL驱动版本,以及AppleScript交互相关库(如clj-applescript)的日志配置项。
针对性屏蔽输出
AppleScript交互层处理
执行AppleScript代码时,用Clojure的with-err-str包裹调用逻辑,捕获并过滤无关输出:
(with-err-str (clj-applescript/run-applescript "tell application \"Mail\" to ..."))
PostgreSQL驱动日志调整
在项目日志配置文件(如logback.xml)中,将PostgreSQL或Korma的日志级别调高,屏蔽底层调试日志:
<logger name="org.postgresql" level="INFO"/> <logger name="korma" level="INFO"/>
全局输出过滤
在JVM启动参数中添加自定义日志规则,直接屏蔽包含目标字符串的条目:
-Djava.util.logging.config.file=logging.properties
在logging.properties中添加:
java.util.logging.ConsoleHandler.filter=com.yourpackage.WarningFilter
然后实现简单的过滤器类:
(ns com.yourpackage.WarningFilter (:gen-class :implements [java.util.logging.Filter]) (:import [java.util.logging LogRecord])) (defn -isLoggable [this ^LogRecord record] (not (.contains (.getMessage record) "invokeWithEnv NIYWARNING:")))
临时代码修复
如果暂时无法定位来源,可在程序入口重定向System.err过滤目标字符串:
(System/setErr (proxy [java.io.PrintStream] [System/err] (println [s] (when-not (.contains s "invokeWithEnv NIYWARNING:") (.println (proxy-super) s))) (print [s] (when-not (.contains s "invokeWithEnv NIYWARNING:") (.print (proxy-super) s)))))
系统层面排查
- 打开macOS控制台.app,查看"日志"标签下与Apple Mail、JNI调用相关的系统日志,确认警告是否来自系统底层而非程序代码。
- 升级依赖版本:更新
korma、PostgreSQL驱动及AppleScript交互库到最新稳定版,排查是否为旧版本已知bug。
内容的提问来源于stack exchange,提问作者John Daschbach
相关产品推荐
相关产品推荐

