import {Fragment} from 'react'; import ExternalLink from 'sentry/components/links/externalLink'; import Link from 'sentry/components/links/link'; import {Layout, LayoutProps} from 'sentry/components/onboarding/gettingStartedDoc/layout'; import {ModuleProps} from 'sentry/components/onboarding/gettingStartedDoc/sdkDocumentation'; import {StepType} from 'sentry/components/onboarding/gettingStartedDoc/step'; import {PlatformOption} from 'sentry/components/onboarding/gettingStartedDoc/types'; import {useUrlPlatformOptions} from 'sentry/components/onboarding/platformOptionsControl'; import {t, tct} from 'sentry/locale'; export enum PackageManager { GRADLE = 'gradle', MAVEN = 'maven', } type PlatformOptionKey = 'packageManager'; interface StepsParams { dsn: string; packageManager: PackageManager; organizationSlug?: string; projectSlug?: string; sourcePackageRegistries?: ModuleProps['sourcePackageRegistries']; } // Configuration Start const platformOptions: Record = { packageManager: { label: t('Package Manager'), items: [ { label: t('Gradle'), value: PackageManager.GRADLE, }, { label: t('Maven'), value: PackageManager.MAVEN, }, ], }, }; const introduction = (

{tct( 'The [code:sentry-log4j2] library provides [log4jLink:Log4j 2.x] support for Sentry via an [appenderLink:Appender] that sends logged exceptions to Sentry.', { log4jLink: , appenderLink: ( ), code: , } )}

); export const steps = ({ dsn, sourcePackageRegistries, projectSlug, organizationSlug, packageManager, }: StepsParams): LayoutProps['steps'] => [ { type: StepType.INSTALL, description: t( "Install Sentry's integration with Log4j 2.x using %s:", packageManager === PackageManager.GRADLE ? 'Gradle' : 'Maven' ), configurations: [ { description: (

{tct( 'To see source context in Sentry, you have to generate an auth token by visiting the [link:Organization Auth Tokens] settings. You can then set the token as an environment variable that is used by the build plugins.', { link: , } )}

), language: 'bash', code: 'SENTRY_AUTH_TOKEN=___ORG_AUTH_TOKEN___', }, ...(packageManager === PackageManager.GRADLE ? [ { description: (

{tct( 'The [link:Sentry Gradle Plugin] automatically installs the Sentry SDK as well as available integrations for your dependencies. Add the following to your [code:build.gradle] file:', { code: , link: ( ), } )}

), language: 'groovy', code: ` buildscript { repositories { mavenCentral() } } plugins { id "io.sentry.jvm.gradle" version "${ sourcePackageRegistries?.isLoading ? t('\u2026loading') : sourcePackageRegistries?.data?.['sentry.java.android.gradle-plugin']?.version ?? '3.12.0' }" } sentry { // Generates a JVM (Java, Kotlin, etc.) source bundle and uploads your source code to Sentry. // This enables source context, allowing you to see your source // code as part of your stack traces in Sentry. includeSourceContext = true org = "${organizationSlug}" projectName = "${projectSlug}" authToken = System.getenv("SENTRY_AUTH_TOKEN") } `, }, ] : []), ...(packageManager === PackageManager.MAVEN ? [ { language: 'xml', partialLoading: sourcePackageRegistries?.isLoading, description: (

{tct( 'The [link:Sentry Maven Plugin] automatically installs the Sentry SDK as well as available integrations for your dependencies. Add the following to your [code:pom.xml] file:', { code: , link: ( ), } )}

), code: ` io.sentry sentry-maven-plugin ${ sourcePackageRegistries?.isLoading ? t('\u2026loading') : sourcePackageRegistries?.data?.['sentry.java.maven-plugin']?.version ?? '0.0.4' } true true ${organizationSlug} ${projectSlug} \${env.SENTRY_AUTH_TOKEN} uploadSourceBundle ... `, }, ] : []), ], additionalInfo: (

{tct( 'If you prefer to manually upload your source code to Sentry, please refer to [link:Manually Uploading Source Context].', { link: ( ), } )}

), }, { type: StepType.CONFIGURE, description: t( "Configure Sentry as soon as possible in your application's lifecycle:" ), configurations: [ { language: 'xml', description: (

{tct( 'The following example using the [log4j2Code:log4j2.xml] format to configure a [sentryConsoleAppenderCode:ConsoleAppender] that logs to standard out at the INFO level, and a [sentryAppenderCode:SentryAppender] that logs to the Sentry server at the ERROR level.', { log4j2Code: , sentryConsoleAppenderCode: , sentryAppenderCode: , } )}

), code: ` `, additionalInfo: (

{tct( "You'll also need to configure your DSN (client key) if it's not already in the [code:log4j2.xml] configuration. Learn more in [link:our documentation for DSN configuration].", { code: , link: ( ), } )}

), }, { description: (

{tct( "Next, you'll need to set your log levels, as illustrated here. You can learn more about [link:configuring log levels] in our documentation.", { link: ( ), } )}

), configurations: [ { language: 'xml', code: ` `, }, ], }, ], }, { type: StepType.VERIFY, description: t( 'Last, create an intentional error, so you can test that everything is working:' ), configurations: [ { language: 'java', code: [ { language: 'java', label: 'Java', value: 'java', code: ` import java.lang.Exception; import io.sentry.Sentry; try { throw new Exception("This is a test."); } catch (Exception e) { Sentry.captureException(e); }`, }, { language: 'java', label: 'Kotlin', value: 'kotlin', code: ` import java.lang.Exception import io.sentry.Sentry try { throw Exception("This is a test.") } catch (e: Exception) { Sentry.captureException(e) }`, }, ], }, ], additionalInfo: (

{t( "If you're new to Sentry, use the email alert to access your account and complete a product tour." )}

{t( "If you're an existing user and have disabled alerts, you won't receive this email." )}

), }, ]; export const nextSteps = [ { id: 'examples', name: t('Examples'), description: t('Check out our sample applications.'), link: 'https://github.com/getsentry/sentry-java/tree/main/sentry-samples', }, ]; // Configuration End export function GettingStartedWithLog4j2({ dsn, sourcePackageRegistries, projectSlug, organization, ...props }: ModuleProps) { const optionValues = useUrlPlatformOptions(platformOptions); const nextStepDocs = [...nextSteps]; return ( ); } export default GettingStartedWithLog4j2;