// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= DevFaqUIGestures
:jbake-type: wiki
:jbake-tags: wiki, devfaq, needsreview
:jbake-status: published
:keywords: Apache NetBeans wiki DevFaqUIGestures
:description: Apache NetBeans wiki DevFaqUIGestures
:toc: left
:toc-title:
:syntax: true

==== DevFaqUIGestures

A perfect tool to get you know users of your application. link:UIGesturesCollector.asciidoc[Read more...].

== How should the LogRecords be named

Use link:http://bits.netbeans.org/dev/javadoc/org-openide-util/org/openide/util/doc-files/logging.html[structured logging] e.g. use just a machine name for a log record's message and keep its localized version in a Bundle. Set the logger name to be below the namespace {org.netbeans.ui} in some meaningful subpackage.

The statistic on the server shall then recognize the logger name as well as the message.

== How to verify that my "agent" is logging correctly?

Make sure the interactive gestures collector is installed. Make "Memory" toolbar visible. Execute the action that does the logging. Invoke the icon in the "memory" toolbar and "View Data". Use the combo box to scroll to the right message - which anyway should be somewhere at the bottom of the displayed file.

== How to find out existing logger

They are listed at link:UIGesturesCollector.asciidoc[UIGesturesCollector].

=== Apache Migration Information

The content in this page was kindly donated by Oracle Corp. to the
Apache Software Foundation.

This page was exported from link:http://wiki.netbeans.org/DevFaqUIGestures[http://wiki.netbeans.org/DevFaqUIGestures] , 
that was last modified by NetBeans user Dsimonek 
on 2009-12-03T16:04:18Z.


*NOTE:* This document was automatically converted to the AsciiDoc format on 2018-02-07, and needs to be reviewed.
