小编Mus*_*ice的帖子

是否存在使用消息参数作为属性创建JSON对象的Logback布局?

我想将日志事件作为带有参数化字符串消息的JSON对象发送到Loggly.我们的项目目前有很多代码如下:

String someParameter = "1234";
logger.log("This is a log message with a parameter {}", someParameter);
Run Code Online (Sandbox Code Playgroud)

我们目前正在使用Logback作为我们的SLF4J后端,而Logback的JsonLayout将我们的ILogEvent对象序列化为JSON.因此,当我们将日志事件发送到Loggly时,它们看起来像这样:

{
    "message": "This is a log message with a parameter 1234",
    "level": INFO,
    ....
}
Run Code Online (Sandbox Code Playgroud)

虽然这确实有效,但它会message为每个值发送一个不同的字符串someParameter,这使得Loggly的自动过滤器旁边无用.

相反,我想要一个创建如下所示的JSON的布局:

{
    "message": "This is a log message with a parameter {}",
    "level": INFO,
    "parameters": [
        "1234"
    ]
}
Run Code Online (Sandbox Code Playgroud)

这种格式允许Loggly将所有日志事件与消息This is a log message with a parameter组合在一起,而不管其值如何someParameter.

看起来Logstash的KV过滤器做了类似的事情 - 有没有办法用Logback完成这个任务,没有编写我自己的布局来执行ILogEvent对象的自定义序列化?

java json logback slf4j loggly

27
推荐指数
4
解决办法
3万
查看次数

Java 1.7 + JSCH:java.security.InvalidKeyException:此算法的键太长

我正在尝试使用JSCH将文件上传到远程SFTP共享.每次我尝试从我的代码中连接到共享时,我都会得到一个看起来像这样的异常:

com.jcraft.jsch.JSchException: Session.connect: java.security.InvalidKeyException: Key is too long for this algorithm
    at com.jcraft.jsch.Session.connect(Session.java:558) ~[jsch-0.1.51.jar:na]
    at com.jcraft.jsch.Session.connect(Session.java:183) ~[jsch-0.1.51.jar:na]
Run Code Online (Sandbox Code Playgroud)

我在升级到Java 8时看过描述此错误的帖子,但我们仍然使用Java 7,而且我对Java的加密支持知之甚少,不知道这是否重要.

有些人建议安装JCE(Java Cryptography Extensions)来解决这个问题,所以我试了一下,但是在将相应的jar文件复制到/ libs/security目录并重新启动应用程序之后,我仍然会遇到同样的错误.我们确认通过执行此脚本安装了JCE,并注意到没有抛出异常.

我还尝试使用sftp详细模式下的命令从终端连接到远程SFTP共享.这是我得到的:

OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: /etc/ssh_config line 102: Applying options for *
debug2: ssh_connect: needpriv 0
debug1: Connecting to XXXXXXXXXXXXX [XXXXXXXXXXXX] port XX.
debug1: Connection established.
debug3: Incorrect RSA1 identifier …
Run Code Online (Sandbox Code Playgroud)

java sftp jce jsch java-7

9
推荐指数
1
解决办法
4664
查看次数

当依赖树中存在两个或多个版本的依赖项时,Maven 如何选择该依赖项的版本?

我有一个项目依赖于我维护的一个名为 microservices-common 的库。微服务通用库又依赖于commons-codec:1.11. 但是,当我尝试在项目中使用 microservices-common 时,commons-codec:1.10最终出现在我的类路径上,并且我的代码无法编译,因为 microservices-common 正在尝试使用org.apache.commons.codec.digest.DigestUtils添加到 中commons-codec:1.11但不存在于 中的构造函数commons-codec:1.10

以下是 microservices-common 依赖关系树的相关部分:

[INFO] com.myproject:microservice-common:jar:1.0-SNAPSHOT
[INFO] +- commons-codec:commons-codec:jar:1.11:compile
[INFO] +- org.apache.httpcomponents:httpclient:jar:4.5.5:compile
[INFO] |  \- (commons-codec:commons-codec:jar:1.10:compile - omitted for conflict with 1.11)
[INFO] \- com.myproject:restful:jar:4.1.5-SNAPSHOT:compile
[INFO]    +- com.myproject:restful-common:jar:4.1.5-SNAPSHOT:compile
[INFO]    |  \- (commons-codec:commons-codec:jar:1.8:compile - omitted for conflict with 1.11)
[INFO]    \- (commons-codec:commons-codec:jar:1.8:compile - omitted for conflict with 1.11)
Run Code Online (Sandbox Code Playgroud)

如果我正确地读取了树,则其他版本的commons-codec依赖项(包括 v1.8 和 v1.10)将从类路径中省略,以支持 v1.11,这就是我想要的。

但是,如果我从依赖于 microservices-common 的项目的角度拉取依赖关系树,它看起来像这样:

[INFO] com.myproject:microservice:jar:1.0-SNAPSHOT
[INFO] +- …
Run Code Online (Sandbox Code Playgroud)

dependencies dependency-management maven

9
推荐指数
1
解决办法
2748
查看次数

AWS Lambda - 如果我启动一个线程,当Lambda被冻结/解冻时会发生什么?

我有一个基于Java的AWS Lambda函数启动后台线程.该线程运行计划任务,将度量标准报告给外部服务.

根据Lambda文档,Lambda函数在完成执行后将被"冻结"一段时间,并且可以"解冻"并在短时间内再次触发函数时重新使用.

我的问题是当发生这种情况时后台线程会发生什么.比如说,我在包含我的处理函数的类的构造函数中启动了我的后台线程.根据文档,处理函数范围之外的所有变量都将保持初始化,因此我的线程应该仍然存在,但它仍然会运行吗?我的线程在后台运行的事实会阻止Lambda首先完成执行吗?或者它会超过五分钟限制,因为即使处理程序功能已完成,它还没有完全完成?

java multithreading amazon-web-services aws-lambda

8
推荐指数
1
解决办法
2745
查看次数

Jenkins Pipeline:在bash脚本中导出和读取环境变量

我有一个构建管道,需要从一些bash脚本中提取一个值,并在其他地方使用该值.我试图将我的bash脚本的结果存储在这样的环境变量中:

#!/usr/bin/env groovy

pipeline {
    agent none

    stages {
        stage('Break Jenkins') {
            agent any
            steps {    
                sh """
                  ENV_VAR=\$(awk -F'-' '{print \$2 }' <<< \$(ls installer-*-ia32-win.zip))
                  echo $ENV_VAR
                """
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当解释器遇到这echo $ENV_VAR条线时,Jenkins抛出一个异常:

groovy.lang.MissingPropertyException:没有这样的属性:ENV_VAR for class:groovy.lang.Binding

我试图ENV_VAR通过转义美元符号前缀来告诉Jenkins解释器不是Jenkinsfile环境变量,如下所示:

echo \$ENV_VAR
Run Code Online (Sandbox Code Playgroud)

并且喜欢这个

echo '$ENV_VAR'
Run Code Online (Sandbox Code Playgroud)

都没有按预期工作.我认为这是一个问题,我在一个字符串块(sh """ ... """)的语法内,并告诉詹金斯不要试图ENV_VARenvs集合中获取值.

无论如何,我没有太多的运气谷歌搜索解决这个问题,因为詹金斯的管道有自己的环境变量的概念,似乎是与bash环境变量分开.

看起来我只能在一个environment块中设置一个Jenkinsfile环境变量,这没有用,因为我已经在一个sh块里面了.

简而言之,有没有办法在块中设置和访问环境变量的值sh

groovy jenkins jenkins-pipeline

7
推荐指数
1
解决办法
7954
查看次数

使用maven-shade-plugin时出现依赖冲突怎么办?

我正在使用 maven-shade-plugin 创建一个可执行 jar,其中包含项目的所有依赖项。有时,这些依赖项会带来自己的依赖项,与其他库的依赖项发生冲突,并且 maven-shade-plugin 警告我不确定要在 uber jar 中包含哪个版本。

[WARNING] maven-shade-plugin has detected that some .class files
[WARNING] are present in two or more JARs. When this happens, only
[WARNING] one single version of the class is copied in the uberjar.
[WARNING] Usually this is not harmful and you can skeep these
[WARNING] warnings, otherwise try to manually exclude artifacts
[WARNING] based on mvn dependency:tree -Ddetail=true and the above
[WARNING] output
Run Code Online (Sandbox Code Playgroud)

一般来说,我对此警告的回应是使用<exclusions>pom 文件中依赖项声明的元素从我的项目中删除有问题的依赖项:

<!-- Amazon ElastiCache Client --> …
Run Code Online (Sandbox Code Playgroud)

dependencies maven maven-shade-plugin

6
推荐指数
1
解决办法
2494
查看次数

Java加密:我应该使用哪些算法?

我正在研究一个需要存储静态加密的二进制信息的程序.不幸的是,我似乎无法找到一种资源来解释哪种加密方案最适合不同的应用程序.

由于加密很复杂而且我不是专家,所以我决定使用一个名为Jasypt的库来包装Java的内置加密函数.为了弄清楚我可以使用哪些算法,我写了一些单元测试.

第一个测试调用Jasypt的AlgorithmRegistry.getAllPBEAlgorithms()函数并列出所有可用的加密算法:

PBEWITHHMACSHA1ANDAES_128
PBEWITHHMACSHA1ANDAES_256
PBEWITHHMACSHA224ANDAES_128
PBEWITHHMACSHA224ANDAES_256
PBEWITHHMACSHA256ANDAES_128
PBEWITHHMACSHA256ANDAES_256
PBEWITHHMACSHA384ANDAES_128
PBEWITHHMACSHA384ANDAES_256
PBEWITHHMACSHA512ANDAES_128
PBEWITHHMACSHA512ANDAES_256
PBEWITHMD5ANDDES
PBEWITHMD5ANDTRIPLEDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
Run Code Online (Sandbox Code Playgroud)

在运行时,EncryptionOperationNotPossibleException如果您尝试使用由于某种原因不支持或违反Java加密规则的算法,Jasypt将抛出一个.有趣的是,如果我尝试使用每个"可用"算法来加密然后解密某些任意数据,并且只打印掉那些没有抛出异常的数据,我会得到这个精简列表:

PBEWITHMD5ANDDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
Run Code Online (Sandbox Code Playgroud)

可以通过拉入BouncyCastle JCE并通过执行来注册它来扩展可用算法列表Security.addProvider(new BouncyCastleProvider()).如果我在执行此操作后重复上一个测试,我会得到一个更大的算法列表供您选择:

PBEWITHMD2ANDDES
PBEWITHMD5AND128BITAES-CBC-OPENSSL
PBEWITHMD5AND192BITAES-CBC-OPENSSL
PBEWITHMD5AND256BITAES-CBC-OPENSSL
PBEWITHMD5ANDDES
PBEWITHMD5ANDRC2
PBEWITHSHA1ANDDES
PBEWITHSHA1ANDDESEDE
PBEWITHSHA1ANDRC2
PBEWITHSHA1ANDRC2_128
PBEWITHSHA1ANDRC2_40
PBEWITHSHA1ANDRC4_128
PBEWITHSHA1ANDRC4_40
PBEWITHSHA256AND128BITAES-CBC-BC
PBEWITHSHA256AND192BITAES-CBC-BC
PBEWITHSHA256AND256BITAES-CBC-BC
PBEWITHSHAAND128BITAES-CBC-BC
PBEWITHSHAAND128BITRC2-CBC
PBEWITHSHAAND128BITRC4
PBEWITHSHAAND192BITAES-CBC-BC
PBEWITHSHAAND2-KEYTRIPLEDES-CBC
PBEWITHSHAAND256BITAES-CBC-BC
PBEWITHSHAAND3-KEYTRIPLEDES-CBC
PBEWITHSHAAND40BITRC2-CBC
PBEWITHSHAAND40BITRC4
PBEWITHSHAANDIDEA-CBC
PBEWITHSHAANDTWOFISH-CBC
Run Code Online (Sandbox Code Playgroud)

不幸的是,现在我不知道这些算法中哪一个最适合我的应用程序.我有一个暗示,AES是正确的方法,它看起来PBEWITHSHA256AND256BITAES-CBC-BC是具有最长密钥长度的AES实现,但我不知道去哪里确认这种怀疑.

哪些方案提供最高安全级别并且具有明显的安全问题?

编辑:我希望能够分发我的代码,而无需最终用户安装无限加密文件,因为这几乎肯定超出了不那么精通技术的用户的能力.我真正想要的是在不使用无限强度管辖权文件的情况下获得的最强加密.

java encryption cryptography bouncycastle jasypt

6
推荐指数
1
解决办法
8391
查看次数

在集群环境中创建 Quartz 触发器

相关:Quartz 集群 - 服务器启动时重复触发器

我正在使用 Quartz Scheduler 来管理基于 java 的集群环境中的计划作业。在任何给定时间,集群中都有少量节点,它们都运行 Quartz,并由所有节点都连接到的 postgresql 数据库中的数据存储提供支持。

当实例初始化时,它会尝试通过执行以下代码来创建或更新 Quartz 数据存储中的作业和触发器:

private void createOrUpdateJob(JobKey jobKey, Class<? extends org.quartz.Job> clazz, Trigger trigger) throws SchedulerException {
    JobBuilder jobBuilder = JobBuilder.newJob(clazz).withIdentity(jobKey);
    if (!scheduler.checkExists(jobKey)) {
        // if the job doesn't already exist, we can create it, along with its trigger. this prevents us
        // from creating multiple instances of the same job when running in a clustered environment
        scheduler.scheduleJob(jobBuilder.build(), trigger);
        log.error("SCHEDULED JOB WITH KEY " + jobKey.toString());
    } else …
Run Code Online (Sandbox Code Playgroud)

java race-condition quartz-scheduler

6
推荐指数
1
解决办法
3633
查看次数

向Backbone.js添加HTTP基本身份验证标头同步功能可防止在Save()上更新模型

我正在开发一个Web应用程序,它由一个用Python的CherryPy框架编写的restful API提供支持.我开始用jQuery和服务器端模板的组合编写用户界面,但最终切换到Backbone.js因为jQuery失控.

不幸的是,我在让我的模型与服务器同步时遇到了一些问题.这是我的代码中的一个简单示例:

$(function() {
    var User = Backbone.Model.extend({
        defaults: {
            id: null,
            username: null,
            token: null,
            token_expires: null,
            created: null
        },

        url: function() {
            return '/api/users';
        },

        parse: function(response, options) {
            console.log(response.id);
            console.log(response.username);
            console.log(response.token);
            console.log(response.created);
            return response;
        }
    });

    var u = new User();
    u.save({'username':'asdf', 'token':'asdf'}, {
        wait: true,
        success: function(model, response) {
            console.log(model.get('id'));
            console.log(model.get('username'));
            console.log(model.get('token'));
            console.log(model.get('created'));
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

您可能会说,这里的想法是使用该服务注册新用户.当我打电话时u.save();,Backbone确实向服务器发送了一个POST请求.以下是相关位:

请求:

Request URL: http://localhost:8080/api/users
Request Method: POST
Request Body: {"username":"asdf","token":"asdf","id":null,"token_expires":null,"created":null}
Run Code Online (Sandbox Code Playgroud)

响应:

Status Code: HTTP/1.1 200 OK …
Run Code Online (Sandbox Code Playgroud)

javascript cherrypy basic-authentication http-headers backbone.js

5
推荐指数
1
解决办法
7237
查看次数

某些 gcloud 命令返回 UNAUTHENTICATED 错误

我正在开发一个托管在 Google Cloud Platform 上的项目,我正在尝试适应他们的gcloudcli。我真正不明白的一件事是它的身份验证方案。

例如,如果我运行gcloud config configurations list,我会得到所有配置的列表:

PS C:\Users\username\dev\project-library> gcloud config configurations list
NAME                     IS_ACTIVE  ACCOUNT         PROJECT                  COMPUTE_DEFAULT_ZONE  COMPUTE_DEFAULT_REGION
default                  True       username@domain.com  project-dev-gcp
project-dev-local        False                           project-dev-gcp
Run Code Online (Sandbox Code Playgroud)

同样,如果我运行gcloud auth list,它会显示我通过身份验证的帐户:

PS C:\Users\username\dev\project-library> gcloud auth list
           Credentialed Accounts
ACTIVE             ACCOUNT
*                  username@domain.com

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
Run Code Online (Sandbox Code Playgroud)

但如果我尝试运行gcloud projects list,我不会得到我的 GCP 项目列表。相反,我看到一个错误,表明我未经身份验证:

PS C:\Users\username\dev\project-library> gcloud projects list
ERROR: (gcloud.projects.list) UNAUTHENTICATED: Request is missing required authentication …
Run Code Online (Sandbox Code Playgroud)

google-cloud-platform gcloud

3
推荐指数
1
解决办法
2277
查看次数

Maven 正在尝试使用 /var/empty/.m2/repository 作为我的本地存储库

这只是几分钟前开始的。直到今天下午,我都能够mvn clean install从我的项目目录中运行,没有任何问题。我今天下午尝试这样做,但出现以下错误:

MusikPolice$ mvn -X clean install
Apache Maven 3.1.1 (0728685237757ffbf44136acec0402957f723d9a; 2013-09-17 11:22:22-0400)
Maven home: /Applications/apache-maven-3.1.1
Java version: 1.7.0_45, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "mac os x", version: "10.9.1", arch: "x86_64", family: "mac"
[INFO] Error stacktraces are turned on.
[DEBUG] Reading global settings from /Applications/apache-maven-3.1.1/conf/settings.xml
[DEBUG] Reading user settings from /var/empty/.m2/settings.xml
[DEBUG] Using local repository at /var/empty/.m2/repository
[ERROR] Could not create local repository at /var/empty/.m2/repository -> [Help 1] …
Run Code Online (Sandbox Code Playgroud)

maven-3 maven

0
推荐指数
1
解决办法
6745
查看次数