swift";“打印”;不';当在ECS上的docker中运行时,不会在标准输出中出现,但第三方c库日志会出现
因此,当通过swift";“打印”;不';当在ECS上的docker中运行时,不会在标准输出中出现,但第三方c库日志会出现,swift,docker,amazon-ecs,swift-package-manager,Swift,Docker,Amazon Ecs,Swift Package Manager,因此,当通过xcode在dev中或使用SPM编译时,本地控制台日志会按预期显示 i、 e使用SPM本地一切正常 swift build --configuration release .build/release/Myapp # prints to console 但是,当我通过运行在ECS(我想是linux)上的docker容器运行可执行文件时,我看不到Swift代码生成的日志,但我确实看到第三方库打印stderr(即libssl打印错误)以及启动应用程序时的shell日志 例如: Doc
xcode
在dev中或使用SPM
编译时,本地控制台日志会按预期显示
i、 e使用SPM
本地一切正常
swift build --configuration release
.build/release/Myapp # prints to console
但是,当我通过运行在ECS(我想是linux)上的docker容器运行可执行文件时,我看不到Swift代码生成的日志,但我确实看到第三方库打印stderr(即libssl打印错误)以及启动应用程序时的shell日志
例如:
Dockerfile
FROM swift
WORKDIR /app
COPY Package.swift ./
COPY Sources ./Sources
COPY Tests ./Tests
RUN swift package clean
RUN swift build --configuration release
RUN chmod +x start.sh
CMD ["start.sh"] # just a wrapper to see if "echo" works
在start.sh中
# prints as expected
echo "hi this will print"
# nothing in the executable will print though
.build/release/MyApp
我不知道为什么它没有显示在标准输出中,但您可以这样做: <代码>导入基础 内部结构FileHandleOutputStream:TextOutputStream{ 私有let fileHandle:fileHandle let编码:String.encoding init(fileHandle:fileHandle,编码:String.encoding=.utf8){ self.fileHandle=fileHandle self.encoding=编码 } 变异函数写入(uString:string){ 如果let data=string.data(使用:编码){ fileHandle.write(数据) } } } 内部变量STDERR=FileHandleOutputStream(.standardError) 内部变量STDOUT=FileHandleOutputStream(.standardOutput) 它允许您执行以下操作:
打印(“错误消息”,收件人:&STDERR)
打印到标准错误
我知道这只是一个解决办法,但它可能比什么都没有好。我不知道为什么它没有显示在标准输出中,但您可以这样做: <代码>导入基础 内部结构FileHandleOutputStream:TextOutputStream{ 私有let fileHandle:fileHandle let编码:String.encoding init(fileHandle:fileHandle,编码:String.encoding=.utf8){ self.fileHandle=fileHandle self.encoding=编码 } 变异函数写入(uString:string){ 如果let data=string.data(使用:编码){ fileHandle.write(数据) } } } 内部变量STDERR=FileHandleOutputStream(.standardError) 内部变量STDOUT=FileHandleOutputStream(.standardOutput) 它允许您执行以下操作:
打印(“错误消息”,收件人:&STDERR)
打印到标准错误
我知道这只是一个解决办法,但可能总比什么都没有好。也有同样的问题,我提交了一个雷达,苹果回答: 当通过管道传输到另一个进程时,打印将被缓冲,因此在缓冲区填满之前不会显示任何字符。(当通过管道传输到终端时,我们只需缓冲,直到到达新行。) 通过在启动时调用
setbuf(stdout,nil)
一次,可以获得所需的行为:
同样的问题,我提交了雷达,苹果公司回答: 当通过管道传输到另一个进程时,打印将被缓冲,因此在缓冲区填满之前不会显示任何字符。(当通过管道传输到终端时,我们只需缓冲,直到到达新行。) 通过在启动时调用
setbuf(stdout,nil)
一次,可以获得所需的行为:
有了这段代码,您将覆盖所有打印,这样它就可以在Linux和Mac Xcode上工作。 我使用了@sam的响应并添加了覆盖打印
import Foundation
internal var STDERR = FileHandleOutputStream(.standardError)
internal var STDOUT = FileHandleOutputStream(.standardOutput)
internal struct FileHandleOutputStream: TextOutputStream {
private let fileHandle: FileHandle
let encoding: String.Encoding
init(_ fileHandle: FileHandle, encoding: String.Encoding = .utf8) {
self.fileHandle = fileHandle
self.encoding = encoding
}
mutating func write(_ string: String) {
if let data = string.data(using: encoding) {
fileHandle.write(data)
}
}
}
///
/// Override of the print so it can work with Linux and MAC
/// https://stackoverflow.com/questions/39026752/swift-extending-functionality-of-print-function
public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
let output = items.map { "\($0)" }.joined(separator: separator)
#if os(Linux)
print(output, to: &STDERR)
#else
Swift.print(output, terminator: terminator)
#endif
}
有了这段代码,您将覆盖所有打印,这样它就可以在Linux和Mac Xcode上工作。 我使用了@sam的响应并添加了覆盖打印
import Foundation
internal var STDERR = FileHandleOutputStream(.standardError)
internal var STDOUT = FileHandleOutputStream(.standardOutput)
internal struct FileHandleOutputStream: TextOutputStream {
private let fileHandle: FileHandle
let encoding: String.Encoding
init(_ fileHandle: FileHandle, encoding: String.Encoding = .utf8) {
self.fileHandle = fileHandle
self.encoding = encoding
}
mutating func write(_ string: String) {
if let data = string.data(using: encoding) {
fileHandle.write(data)
}
}
}
///
/// Override of the print so it can work with Linux and MAC
/// https://stackoverflow.com/questions/39026752/swift-extending-functionality-of-print-function
public func print(_ items: Any..., separator: String = " ", terminator: String = "\n") {
let output = items.map { "\($0)" }.joined(separator: separator)
#if os(Linux)
print(output, to: &STDERR)
#else
Swift.print(output, terminator: terminator)
#endif
}
没有码头工人也有同样的问题。只需运行
swift run…
即可按预期打印所有内容,但使用swift run…>out.txt 2>err.txt
一切都停止工作FileHandleOutputStream
该作业是否在没有任何Docker的情况下存在相同的问题。只需运行swift run…
即可按预期打印所有内容,但使用swift run…>out.txt 2>err.txt
一切都停止工作FileHandleOutputStream
完成了该工作