如何禁用Azure Blob Java SDK TransferManager的慢操作警告日志
问题描述
我在Java项目中使用azure-storage-blob v11.0.0 SDK,通过以下代码从Blob存储下载文件:
final BlockBlobURL blobURL = containerURL.createBlockBlobURL(blob.getName()); AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open( localFile.toPath(), StandardOpenOption.CREATE, StandardOpenOption.WRITE); ResponseTracker responseTracker = new ResponseTracker( TransferManager.downloadBlobToFile(fileChannel, blobURL, null, null).doAfterTerminate(fileChannel::close).toFuture(), fileName);
但下载过程中有时会输出如下警告:
WARNING: SLOW OPERATION. Duration > 3000 ms. Request try:'1', request duration:'8417' ms, operation duration:'8417' ms
GET: https://xxxx.blob.core.windows.net/xxxx/this%2Fin2%2FoneGBImages7.zip?sv=2017-04-17&ss=bf&srt=co&spr=https&se=2020-07-10T12%3A44%3A41Z&sr=co&sp=racwdlup&sig=REDACTED
Content-Length: 0
x-ms-version: 2018-11-09
x-ms-range: bytes=784334848-788529151
host: xxxx.blob.core.windows.net
connection: keep-alive
If-Match: 0x8D824056357EBBF
x-ms-client-request-id: xxxxx-ac90-47c8-85fa-34e172a7cd47
User-Agent: Azure-Storage/11.0.0 (JavaJRE 13; MacOSX 10.14.6)
我希望禁用该警告,但不想屏蔽存储SDK的所有日志,请问有什么方法可以抑制这个输出?
解决方案:精准定位日志源,调整特定日志器级别
这个慢操作警告是Azure Storage Blob v11.0.0 SDK里的com.microsoft.azure.storage.blob.OperationTracing类输出的,日志级别为WARNING。我们不需要全局屏蔽SDK日志,只需要针对这个特定的日志器调整级别,就能单独关掉这个警告。
方法1:代码动态配置(SDK默认用java.util.logging)
在项目启动的初始化逻辑里加一段代码,把目标日志器的级别设为SEVERE——这样只会放行SEVERE及以上的日志,WARNING级别的慢操作提示就会被过滤掉:
import java.util.logging.Logger; import java.util.logging.Level; // 获取OperationTracing对应的日志实例 Logger opTracingLogger = Logger.getLogger("com.microsoft.azure.storage.blob.OperationTracing"); // 设置级别为SEVERE,屏蔽WARNING及以下的日志 opTracingLogger.setLevel(Level.SEVERE);
方法2:通过logging.properties配置
如果习惯用配置文件管理日志,在项目的logging.properties里加一行配置即可:
com.microsoft.azure.storage.blob.OperationTracing.level = SEVERE
方法3:用SLF4J+Logback/Log4j2的情况
如果你的项目已经用了SLF4J配合Logback或Log4j2,直接在对应的配置文件里给这个日志器设置级别:
Logback示例(logback.xml)
<logger name="com.microsoft.azure.storage.blob.OperationTracing" level="ERROR" additivity="false"> <appender-ref ref="你的输出Appender名称"/> </logger>
Log4j2示例(log4j2.xml)
<Logger name="com.microsoft.azure.storage.blob.OperationTracing" level="ERROR" additivity="false"> <AppenderRef ref="你的输出Appender名称"/> </Logger>
为什么这样可行?
以上配置只会针对OperationTracing类的日志生效,SDK其他类输出的ERROR、SEVERE级别的日志(比如请求失败、权限错误等)都会正常输出,完全满足你“不屏蔽所有SDK日志”的需求。
内容的提问来源于stack exchange,提问作者OneTwo

